其实这种中档的问题,要是好好思考的话还是可以想出来的就是要深入的思考,实在不行就改变一下思路。
这个书写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 ",res[k]&1); } } }