其实这种中档的问题,要是好好思考的话还是可以想出来的就是要深入的思考,实在不行就改变一下思路。
这个书写bitset的模板还是应该好好的记住的,真的感觉不错。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<bitset>
#include<set>
#include<vector>
using namespace std;
const int N=6e4+32;
vector<int>G[N];
set<int>S;
int vis[N],a[N],b[N],res[N];
long long dig[N][50];
long long ans[N];
void inist(int r)
{
for(int i=1;i<=r;i++)
{
for(int j=1;j*j<=i;j++)
{
if(i%j) continue;
if(i%j==0)
{
G[i].push_back(j);
if(i/j!=j) G[i].push_back(i/j);
}
}
//sort(G[i].begin(),G[i].end());
}
}
int main()
{
int T;
scanf("%d",&T);
inist(N-2);
while(T--)
{
S.clear();
int n,m,q;
int maxn_date=0;
scanf("%d%d%d",&n,&m,&q);
memset(ans,0,sizeof(ans));
memset(dig,0,sizeof(dig));
memset(res,0,sizeof(res));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]=1;
maxn_date=max(maxn_date,a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
S.insert(b[i]);
}
sort(b+1,b+1+m);
for(int i=1;i<N-100;i++)
{
long long su=0;
for(int j=0;j<32;j++)
{
su=su*2+vis[i+j];
dig[i][j+1]=su;
dig[i][j+1]<<=(31-j);
}
}
for(int i=1;i<=maxn_date;i++)
{
int sz=G[i].size();
for(int j=0;j<sz;j++)
{
int x=G[i][j];
if(!S.count(x))continue;
int L=0,R=x-1;
while(L<=R)
{
int d=L/32;
if(i+L>N-100) break;
if(L+31<=R)
{
ans[d]^=dig[i+L][32];
L+=32;
}
else
{
ans[d]^=dig[i+L][R-L+1];
L=R+1;
}
}
}
}
for(int i=0;i*32<=5e4+50;i++)
{
int j=(i+1)*32-1;
int t=32;
while(t--)
{
res[j]=ans[i]&1; j--;
ans[i]>>=1;
}
}
for(int i=1;i<=n;i++)
{
int x=a[i];
res[x]+=m-(upper_bound(b+1,b+1+m,x)-(b+1));
}
while(q--)
{
int k;
scanf("%d",&k);
printf("%d\n",res[k]&1);
}
}
}