洛谷P1503 鬼子進村 [平衡樹,STL]
阿新 • • 發佈:2018-09-29
三種 lag true lin 展開 getc 維護 cstring scanf
題目傳送門
鬼子進村
題目背景
小卡正在新家的客廳中看電視。電視裏正在播放放了千八百次依舊重播的《亮劍》,劇中李雲龍帶領的獨立團在一個縣城遇到了一個鬼子小隊,於是獨立團與鬼子展開遊擊戰。
題目描述
描述 縣城裏有n個用地道相連的房子,第i個只與第i-1和第i+1個相連。這是有m個消息依次傳來
1、消息為D x:鬼子將x號房子摧毀了,地道被堵上。
2、消息為R :村民們將鬼子上一個摧毀的房子修復了。
3、消息為Q x:有一名士兵被圍堵在x號房子中。
李雲龍收到信息很緊張,他想知道每一個被圍堵的士兵能夠到達的房子有幾個。
輸入輸出格式
輸入格式:
第一行2個整數n,m(n,m<=50000)。
接下來m行,有如題目所說的三種信息共m條。
輸出格式:
對於每一個被圍堵的士兵,輸出該士兵能夠到達的房子數。
輸入輸出樣例
輸入樣例#1:7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4
輸出樣例#1: 1
0
2
4
說明
若士兵被圍堵在摧毀了的房子中,那只能等死了。。。。。。
分析:
本來想用這題隨便搞個平衡樹玩一下,結果就變成了$vector$水分23333。
是的這題很裸,如果有房子被摧毀就丟進平衡樹裏維護,修好了就從平衡樹中刪除,如果詢問就在平衡樹中找前驅後繼算差值就行了,註意邊界問題以及士兵所在房子被摧毀的情況就行了。
無比清(nan)新(kan)的$vector$實現平衡樹。
Code:
//It is made by HolseLee on 28th Sep 2018 //Luogu.org P1503 #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=5e4+7; int n,m,las,h[N]; booldes[N]; vector<int>v; inline int read() { char ch=getchar(); int num=0; bool flag=false; while( ch<‘0‘ || ch>‘9‘ ) { if( ch==‘-‘ ) flag=true; ch=getchar(); } while( ch>=‘0‘ && ch<=‘9‘ ) { num=(num<<1)+(num<<3)+(ch^48); ch=getchar(); } return flag ? -num : num; } void print(int x) { if( x>9 ) print(x/10); putchar(x%10+‘0‘); } inline int get(int x) { if( des[x] )return 0; int p=lower_bound(v.begin(),v.end(),x)-v.begin(); return v[p]-v[p-1]-1; } int main() { n=read(); m=read(); char op[3]; int x; v.push_back(0); v.push_back(n+1); for(int i=1; i<=m; ++i) { scanf("%s",op); if( op[0]==‘D‘ ) { x=read(); des[h[++las]=x]=1; v.insert(lower_bound(v.begin(),v.end(),x),x); } else if( op[0]==‘R‘ ) { if( las==0 ) continue; v.erase(lower_bound(v.begin(),v.end(),h[las])); des[h[las--]]=0; } else { x=read(); print(get(x)), putchar(‘\n‘); } } return 0; }
洛谷P1503 鬼子進村 [平衡樹,STL]