萌新求助拆位
查看原帖
萌新求助拆位
356740
封禁用户楼主2020/8/10 10:23

RT,样例是可以通过的,但是实际测试就……

#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
inline ull read(){
	char ch=getchar();
	ull x=0;
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	return x;
} 
int bits[32],kb[32],kb2[32],n,q,tmp2;
ull pow2[32],tmp,sum,sum2;

inline void calc() {
	sum=0;
	for(int i=31;i>=0;i--) {
		if(kb2[i])	sum+=(n-bits[i])*pow2[i];
		else sum+=bits[i]*pow2[i];
	}
}

int main(void)  {
	n=read();
	for(int i=0,j=0;i<n;i++) {
		tmp=read();
		while(tmp) bits[j]+=(tmp&1), j++, tmp>>=1;
		j=0;
	}
	for(int i=0;i<32;i++) {
		tmp2=bits[i];
		kb[i]=(tmp2>=(n-tmp2))?1:0;
	}
	memcpy(kb2,kb,sizeof(kb));
	q=read();
	pow2[0]=1;
	for(int i=1;i<32;i++) pow2[i]=pow2[i-1]*2;
	for(int i=0;i<q;i++) {
		tmp=read();
		calc();
		if(sum>tmp) {
			printf("-1\n");
			continue;
		}
		for(int j=31;j>=0;j--) {
			if(!kb2[j]) {
				sum2=sum;
				sum+=(n-2*bits[j])*pow2[j];
				if(sum>tmp) {
					printf("%llu\n",sum2);
					break;
				}
			}
		}
		printf("%llu\n",tmp);
		memcpy(kb2,kb,sizeof(kb));
	}
	return 0;
}

失败记录

2020/8/10 10:23
加载中...