百度之星 毒瘤数据结构题 题解(思维)

题目链接

题目思路

赛时本来用的是线段树上二分,然后T了..

正解如下

我们考虑维护最左边两个 0的位置,设其依次为 a,b

若查询时,将 a 设为了 1,则答案为 b,否则答案为 a。

修改时,若修改了 a,则令 a=b,之后 b 一直递增,直到找到下一个0。

若修改了 b,则 b之后一直递增,直到找到下一个 0。

这样整个序列最多被扫过 2 次,总复杂度为 O(n)。

但hdu这老年机还是能T。。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=5e6+5,inf=0x3f3f3f3f,mod=998244353;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-7;
int n;
bool vis[maxn];
int main(){
    scanf("%d",&n);
    int a=1,b=1;
    for(int i=1,opt,x;i<=n;i++){
        scanf("%d%d",&opt,&x);
        if(opt==1){
            vis[x]=1;
            if(x==a){
                a=b;
                b++;
                while(vis[b]){
                    b++;
                }
            }else if(x==b){
                while(vis[b]){
                    b++;
                }
            }
        }else{
            if(x==a){
                printf("%d\n",b);
            }else{
                printf("%d\n",a);
            }
        }
    }
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15091655.html