题目链接
有N个人,有M个物品,并且给出N个人手中的钱A[i],再给出每个物品的单价B[i],现在,我们要求的是pair(i, j) == k的对数,pair(i, j)表示的是第i个人花尽可能多的钱,买第j个物品,剩余的钱是k。我们现在查询这样的K。
然后把式子化简一下,其实就是相当于,那么,我们要查询全体的K对应的Ki,我们可以直接放在bitset中来维护。我们可以把所有的B也存在bitset中去(定义为bx),然后我们查的是(A >> K) & bx中1的数量就是对应的个数了(% 2)。
这题很容易被卡:3494ms,可能是写的还是不够啊!!!
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
int N, M, Q, price[50005], _UP;
bitset<50005> A, B, ans, bx;
inline void init()
{
A.reset(); B.reset();
ans.reset(); bx.reset();
_UP = 0;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &N, &M, &Q);
init();
for(int i=1, ai; i<=N; i++)
{
scanf("%d", &ai);
A.set(ai);
}
for(int i=1, bi; i<=M; i++)
{
scanf("%d", &bi);
B.set(bi); _UP = max(_UP, bi);
}
for(int i=_UP; i>=0; i--)
{
ans[i] = (((A >> i) & bx).count()) & 1;
if(B[i])
{
for(int j=0; j <= _UP; j += i)
{
bx.flip(j);
}
}
}
int xx;
while(Q--)
{
scanf("%d", &xx);
printf("%d\n", ans[xx] & 1);
}
}
return 0;
}