这两种写法,第一种能过,第二种就不行,蒟蒻实在看不明白哪里不对,路过的大佬帮忙看一眼呗/kel
这是通过的代码(照着题解写的)
(#define int unsigned long long了)
void add(int a, int bit, int* num) {
if(!a) return;
int p = bit >> 6, q = bit & 63;
int st = a << q, ic = a >> (63 - q); ic >>= 1;
int od = num[p]; num[p] += st; ic += (od > num[p]);
if(pos[p] ^ neg[p]) s.insert(p);
else if(s.count(p)) s.erase(p);
p++;
while(ic != 0) {
od = num[p]; num[p] += ic;ic = (od > num[p]);
if(pos[p] ^ neg[p]) s.insert(p);
else if(s.count(p)) s.erase(p);
p++;
}
}
这种是过不去的:
void add(int a, int bit, int* num) {
if(!a) return;
int p = bit >> 6, q = bit & 63;
int st = a << q, ic = a >> (63-q); ic >>= 1;
for(int w = p; st; ++w) {
int tmp = num[w];
num[w] += st;
st = (tmp > num[p]);
if(w == p) st += ic;
if(pos[w] ^ neg[w]) s.insert(w);
else s.erase(w);
}
}