直接构造答案。
#include <cstdio>
#include <iostream>
#define N 100005
using namespace std;
long long a[N], maxx, m, ans, n, q, LG_0[55], LG_1[55];
long long Doit(int d){
long long an = 0, ans = 0;
bool flag = 0;
for(int i = d; i >= 0; i--){
if(an + ((long long)1 << i) * LG_1[i] <= m){
an += ((long long)1 << i) * LG_1[i];
ans += ((long long)1 << i);
}
else if(an + ((long long)1 << i) * LG_0[i] <= m)
an += ((long long)1 << i) * LG_0[i];
else return -1;
}
return ans;
}
int main(){
scanf("%lld", &n);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for(int i = 0; i <= 51; i++)
for(int j = 1; j <= n; j++){
LG_0[i] += (a[j] >> i) & (long long)1;
LG_1[i] += (long long)1 - ((a[j] >> i) & (long long)1);
}
scanf("%lld", &q);
for(int i = 1; i <= q; i++){
scanf("%lld", &m);
ans = Doit(51);
printf("%lld\n", ans);
}
return 0;
}
后面70分全WA了