百度之星 毒瘤資料結構題 題解(思維)
阿新 • • 發佈:2021-08-02
題目連結
題目思路
賽時本來用的是線段樹上二分,然後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; }