1. 程式人生 > 其它 >百度之星 毒瘤資料結構題 題解(思維)

百度之星 毒瘤資料結構題 題解(思維)

題目連結

題目思路

賽時本來用的是線段樹上二分,然後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;
}

卷也卷不過,躺又躺不平