社区讨论
求助卡常(差 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 条回复,欢迎继续交流。
正在加载回复...