维护第二个答案的树状数组,用 cnt 来维护单个节点个数,tree2 来维护前缀和。
if (cnt[x] == 1 && val == -1){
for (int i=x;i<=N;i+=lowbit(i))
tree2[i] -= 1;
cnt[x] = 0;
} else if (cnt[x] == 0 && val == 1){
for (int i=x;i<=N;i+=lowbit(i))
tree2[i] += 1;
cnt[x] = 1;
}
如果你这么写,那很明显是错的。因为 cnt 数组只会有 0 或 1 的状态。
应把 cnt[x] += val 放到 if 语句外边。