0
点赞
收藏
分享

微信扫一扫

2021 年百度之星·程序设计大赛 - 初赛一(1006/毒瘤数据结构题)

​​原题跳转​​

树状数组记录前 i 项1的个数,当前缀和query(i) == i时,说明前 i 项满足要求,
对于op == 1的情况,如果对应位置为0(sum[i] - sum[i - 1] == 0),则改为1,如果本来为1,则不变。
对于op == 2的情况,如果对应位置为0,则改为1,查询结果后恢复,(查询利用二分)

​不知道比赛时能过的思路,现在为啥TLE了...​

#include <iostream>

using namespace std;

int n, t, tree[5000010], cn, x;

void add(int x, int v){

while(x<=n){
tree[x] += v;
x += (x & -x);
}
}

int query(int x){
int res = 0;
while (x){
res += tree[x];
x -= (x & -x);
}
return res;
}

bool check(int x){
return query(x) == x;
}


int main(){

scanf("%d", &n);
t = n;
while (t--){
scanf("%d%d", &cn, &x);
bool flag = false;
int cnt = query(x) - query(x-1);
if(cn==1){
if(!cnt){
add(x, 1);
}
}else{
if(!cnt){
add(x, 1);
flag = true;
}
int l = 1, r = n, mid;
while(l < r){
mid = l + r >> 1;
if(check(mid)){
l = mid + 1;
}else{
r = mid;
}
}
printf("%d\n", l);
}

if(flag){
add(x, -1);
}
}

return 0;
}


举报

相关推荐

0 条评论