月赛第三题求hack
  • 板块学术版
  • 楼主Acfboy
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/8 20:33
  • 上次更新2023/11/6 20:54:45
查看原帖
月赛第三题求hack
40318
Acfboy楼主2020/8/8 20:33

直接构造答案。

#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\color{red}\text{WA}

2020/8/8 20:33
加载中...