关于 div1 A(即 Pro C)
  • 板块学术版
  • 楼主Starlight237
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/8/9 13:28
  • 上次更新2023/11/6 20:51:19
查看原帖
关于 div1 A(即 Pro C)
75765
Starlight237楼主2020/8/9 13:28

解法和正解一模一样,为什么只有 40 pts?

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define ll long long
#define int long long
extern "C"{
namespace io{
#define IOSIZE 10000000 
    static char in[IOSIZE],*p=in,*pp=in,out[IOSIZE],*q=out,ch[20],*t=ch;
    inline char gc(){return p==pp&&(pp=(p=in)+fread(in,1,IOSIZE,stdin),p==pp)?EOF:*p++;}
    inline ll read(){
        reg ll x=0;reg char ch,f=0;
        while(!isdigit(ch=gc()))f|=ch=='-';
        while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=gc();
        return f?-x:x;
    }
    inline void write(ll x){
        x||(*q++=48),x<0&&(*q++='-',x=-x);
        while(x)*t++=x%10+48,x/=10;
        while(t!=ch)*q++=*--t;
        *q++='\n';
    }
    inline void flush(){fwrite(out,1,q-out,stdout);}
}}
#define rd io::read
#define wt io::write
const int N = 100001;
int n, k, q, one[70], zro[70];
long long a[N], m, t;
inline ll solve(ll m) {
    reg ll ans = 0, sum = t;
    for (reg int i = 52; i >= 0; --i)
        if (one[i] >= zro[i]) ans |= 1ll << i, sum -= (one[i] - zro[i]) * (1ll << i);
    if (sum > m) return -1;
    for (reg int i = 52; i >= 0; --i)
    	if (one[i] < zro[i] && sum + (zro[i] - one[i]) * (1ll << i) <= m) ans |= 1ll << i, sum += (zro[i] - one[i]) * (1ll << i);
	return ans;
}
signed main() {
	freopen("1.in", "r", stdin);
	freopen("1.out", "w", stdout);
    n = rd();
    for (reg int i = 1, x; i <= n; ++i) {
        x = a[i] = rd(); t += x;
        for (reg int i = 0; i <= 52; ++i)
            (x & (1ll << i)) ? ++one[i] : ++zro[i];
    }
    for (reg int q = rd(); q; --q) {
        m = rd();
        wt(solve(m));
    }io :: flush();
    return 0;
}
2020/8/9 13:28
加载中...