1 条题解

  • 0
    @ 2026-4-23 23:46:55

    直接考虑从高到低位分治,观察到 cc 只有一个。

    在每一位 pp,分类讨论:

    • ccpp00,这一位 0101 独立,取两种情况的 max\max

    • 否则:

      • 如果 bb 中存在 00 且存在 11

        答案为 aa 中数量减去左右未被任何限制覆盖的 aa 的数量的 max\max

      • 否则可以直接往一个方向递归。

    时间复杂度 O(nlogV)\mathcal{O}(n\log V)

    觉得表述不清楚可以看代码,是完全一样的。

    #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
    上传者