1 条题解
-
0
直接考虑从高到低位分治,观察到 只有一个。
在每一位 ,分类讨论:
-
若 在 处 ,这一位 独立,取两种情况的 。
-
否则:
-
如果 中存在 且存在 :
答案为 中数量减去左右未被任何限制覆盖的 的数量的 。
-
否则可以直接往一个方向递归。
-
时间复杂度 。
觉得表述不清楚可以看代码,是完全一样的。
#include<map> #include<set> #include<ctime> #include<cmath> #include<queue> #include<bitset> #include<cstdio> #include<vector> #include<random> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; #define I ll #define her1 20081214 #define IV void #define cht 1000000007 #define ld long double #define Aestas16 392699 #define ull unsigned long long #define cp(x,y)memcpy(x,y,sizeof y) #define mem(x,val)memset(x,val,sizeof x) #define D(i,j,n)for(register int i=j;i>=n;i--) #define E(i,now)for(register int i=first[now];i;i=e[i].nxt) #define F(i,j,n)for(register int i=j;i<=n;i++) #define DL(i,j,n)for(register i64 i=j;i>=n;i--) #define EL(i,now)for(register i64 i=first[now];i;i=e[i].nxt) #define FL(i,j,n)for(register i64 i=j;i<=n;i++) //#define D(i,j,n)for(int i=j;i>=n;i--) //#define E(i,now)for(int i=first[now];i;i=e[i].nxt) //#define F(i,j,n)for(int i=j;i<=n;i++) //#define DL(i,j,n)for(register ll i=j;i>=n;i--) //#define EL(i,now)for(register ll i=first[now];i;i=e[i].nxt) //#define FL(i,j,n)for(register ll i=j;i<=n;i++) ll read(){ ll ans=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9')ans=ans*10+c-'0',c=getchar(); return ans*f; } #undef ll #include "assert.h" mt19937_64 rnd(her1); #include "functional" using i64 = long long; const int maxn = 5e5+5; i64 n,m,x,A[maxn],B[maxn]; i64 calc(vector<i64>P,vector<i64>Q,i64 X,i64 b){ if(Q.empty())return P.size(); if(P.empty())return 0; if(b==-1){ return P.size(); } vector<i64>Pl,Ql,Pr,Qr; for(auto x:P)if(!(x>>b&1))Pl.push_back(x);else Pr.push_back(x); for(auto x:Q)if(!(x>>b&1))Ql.push_back(x);else Qr.push_back(x); if(!(X>>b&1)){ return calc(Pl,Ql,X,b-1)+calc(Pr,Qr,X,b-1); } X-=(1ll<<b); i64 sum=0; if(Ql.empty()&&Qr.size())sum+=calc(Pl,Qr,X,b-1); if(Qr.empty()&&Ql.size())sum+=calc(Pr,Ql,X,b-1); return sum; } i64 cdq(vector<i64>P,vector<i64>Q,i64 X,i64 b,i64 v=0){ if(P.empty())return v; if(Q.empty())return max(v,1ll); if(b==-1){ return max(v,1ll); } vector<i64>Pl,Ql,Pr,Qr; for(auto x:P)if(!(x>>b&1))Pl.push_back(x);else Pr.push_back(x); for(auto x:Q)if(!(x>>b&1))Ql.push_back(x);else Qr.push_back(x); if(!(X>>b&1)){ return max(cdq(Pl,Ql,X,b-1,v),cdq(Pr,Qr,X,b-1,v)); } X-=(1ll<<b); if(Ql.size()&&Qr.size()){ return v+P.size()-min(calc(Pl,Qr,X,b-1),calc(Pr,Ql,X,b-1)); } if(Ql.size()){ return cdq(Pr,Ql,X,b-1,v+Pl.size()); } if(Qr.size()){ return cdq(Pl,Qr,X,b-1,v+Pr.size()); } } IV solve(){ n=read();m=read();x=read()+1; F(i,1,n)A[i]=read(); F(i,1,m)B[i]=read(); vector<i64>a(A+1,A+1+n); vector<i64>b(B+1,B+1+m); printf("%lld\n",cdq(a,b,x,31)); } int main(){ // freopen("1.in","r",stdin); // freopen("1.out","w",stdout); i64 T=read();while(T--)solve();return 0; } -
- 1
信息
- ID
- 9653
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者