社区讨论

求助卡常(差 100 ms)

P15245[WC2026] 二进制参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mlnkh3rt
此快照首次捕获于
2026/02/15 17:52
4 天前
此快照最后确认于
2026/02/15 18:34
4 天前
查看原帖
真卡不过去了,求救。
CPP
#include <bits/stdc++.h>
// #include "binary.h"
using namespace std;
typedef long long ll;

ll yyx[64]; int p[64][7];
void init(int c, int t){
    memset(yyx, -1, sizeof(yyx)); memset(p, -1, sizeof(p));
    for (int i(0); i<64; ++i){
        int g(6); for (; g && (i>>(g-1)&1); --g); if (g ^ 6) yyx[i] = (1<<g)-(g ? i&((1<<(g-1))-1) : 0);
        for (int j(0); j<7; ++j){
            ll nw(0x3f3f3f3f3f3f3f3f);
            for (int k(0); k<g; ++k){
                ll v((1ll<<k)-(k ? i&((1<<(k-1))-1) : 0)), res(v+__builtin_popcount((i+v)&((1<<j)-1))-__builtin_popcount(i&((1<<j)-1))+((i+v)>>j)-(i>>j));
                if (nw > res) nw = res, p[i][j] = v;
            }
        }
    }
}
ll binary(ll x, ll y){
    int k(__lg(y/x)); ll res(__builtin_popcountll(y&((1ll<<k)-1))+(y>>k)-x);
    if (~yyx[y & 63]) res = min(res, __builtin_popcountll((y+yyx[y&63])&((1ll<<k)-1))+((y+yyx[y&63])>>k)-x+yyx[y&63]);
    if (~p[y & 63][min(k, 6)]) res = min(res, __builtin_popcountll((y+p[y&63][min(k, 6)])&((1ll<<k)-1))+((y+p[y&63][min(k, 6)])>>k)-x+p[y&63][min(k, 6)]);
    return min((x<<(k+1))-y+k+1, res+k);
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int c, t; cin >> c >> t; init(c, t);
    while (t--){ll x, y; cin >> x >> y; cout << binary(x, y) << '\n';}

    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...