黑龙江省赛热身赛05

69 阅读1分钟

题目链接

被精心构造卡了long long

AC代码:

#include <bits/stdc++.h>
using namespace std;

long long sum[70];
int main()
{
    fill(sum, sum + 66, 0);
    long long temp, n;
    scanf("%lld", &n);
    long long summ = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &temp);
        summ += temp;
        for (long long j = 59; j >= 0; j--)
            if (((long long)1 << j) & temp)
                sum[j]++;
    }
    int q;
    scanf("%d", &q);
    while (q--)
    {
        long long tempsumm = summ;

        long long m;
        scanf("%lld", &m);

        long long ans = 0;

        for (long long i = 59; i >= 0; i--)
        {
            if (sum[i] >= n - sum[i])
            {
                tempsumm -= sum[i] * ((long long)1 << i);
                tempsumm += (n - sum[i]) * ((long long)1 << i);
                ans += ((long long)1 << i);
            }
        }
        if (tempsumm > m)
        {
            printf("-1\n");
            continue;
        }
        for (long long i = 59; i >= 0; i--)
        {
            if (((long long)1 << i) & ans)
                continue;
            __int128 temp1 = sum[i] * ((__int128)1 << i);
            __int128 temp2 = (n - sum[i]) * ((__int128)1 << i);
            if (tempsumm + temp2 - temp1 <= m)
            {
                tempsumm += temp2 - temp1;
                ans += ((long long)1 << (i));
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}