https://www.luogu.org/problemnew/show/P1503
题目背景
小卡正在新家的客厅中看电视。电视里正在播放放了千八百次依旧重播的《亮剑》,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战。
题目描述
描述 县城里有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
说明
若士兵被围堵在摧毁了的房子中,那只能等死了。。。。。。
stl——set
1 #include <cstdio> 2 #include <set> 3 4 using namespace std; 5 6 inline void read(int &x) 7 { 8 x=0; register char ch=getchar(); 9 for(; ch>‘9‘||ch<‘0‘; ) ch=getchar(); 10 for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘; 11 } 12 13 set<int>_set; 14 set<int>::iterator pos; 15 16 int n,m,x,tail,que[50005]; 17 18 int Presist() 19 { 20 read(n),read(m); 21 _set.insert(0); 22 _set.insert(n+1); 23 for(char s[1]; m--; ) 24 { 25 scanf("%s",s); 26 if(s[0]==‘D‘) 27 { 28 read(x); 29 _set.insert(x); 30 que[++tail]=x; 31 } 32 else if(s[0]==‘Q‘) 33 { 34 read(x); 35 pos=_set.lower_bound(x); 36 if(*pos==x) puts("0"); 37 else printf("%d\n",(int)*pos-*(--pos)-1); 38 } 39 else 40 { 41 pos=_set.find(que[tail--]); 42 _set.erase(pos); 43 } 44 } 45 return 0; 46 } 47 48 int Aptal=Presist(); 49 int main(int argc,char**argv){;}
时间: 2024-10-10 15:01:32