萌新求助 WA40pts
查看原帖
萌新求助 WA40pts
288586
哈佛大学楼主2020/8/10 08:16
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int a[N][55],b[N];
long long n,x,tot,num,s[55];
long long sum[55],ans;
int q;
long long anss;
long long m;
inline long long read(){
	long long x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
    	if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int main(){
	n=read();num=-2;
	for(int i=1;i<=n;i++){
		x=read();
		tot=-1;
		while(x){
			tot++;
			a[i][tot]=x%2;
			sum[tot]+=x%2;
			x/=2;
		}
		num=max(num,tot);
	}
	/*for(int i=1;i<=n;i++){
		for(int j=num;j>=0;j--)
			cout<<a[i][j];
		cout<<endl;
	}*/
	s[0]=1;
	for(int i=1;i<=50;i++)s[i]=s[i-1]*2;
	for(int j=num;j>=0;j--)
		if(sum[j]>=n-sum[j]){a[n+1][j]=1;ans=ans+s[j]*(n-sum[j]);}
		else {a[n+1][j]=0;ans=ans+s[j]*sum[j];}
	//for(int i=num;i>=0;i--)cout<<a[n+1][i];
	//cout<<endl;
	//cout<<ans<<endl;
	q=read();
	for(int i=1;i<=q;i++){
		m=read();
		//if(ans==0){printf("%lld\n",m);continue;}
		m-=ans;
		if(m<0){printf("-1\n");continue;}
		for(int j=0;j<=50;j++)b[j]=a[n+1][j];
		for(int j=50;j>num;j--)
			if(m>=s[j]*n){
				b[j]=1;
				m-=s[j]*n;
			}
		for(int j=num;j>=0;j--)
			if(b[j]==0)
				if(m>=abs(n-2*sum[j])*s[j]){
					b[j]=1;
					m-=abs(n-2*sum[j])*s[j];
				}
		anss=0;
		for(int j=50;j>=0;j--)
			anss=anss+b[j]*s[j];
		printf("%lld\n",anss);
	}
    return 0;
}
2020/8/10 08:16
加载中...