还是拿set搞。。。
用set记录每个被摧毁的位置,Q的时候二分一下,在和上一个摧毁的位置减一下,即可求出能到的房子数
#include<iostream> #include<cstdio> #include<set> #define R register int const int N=50010; using namespace std; set<int> s; set<int>::iterator it; int stk[N],top,n,m; inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix; } signed main() { n=g(),m=g(); s.insert(0),s.insert(n+1); for(R i=1,x;i<=m;i++) { register char ch; while(!isalpha(ch=getchar())); if(ch=='D') x=g(),s.insert(x),stk[++top]=x; else if(ch=='Q') { x=g(),it=s.lower_bound(x); if(*it==x) {printf("0 "); continue;} R ans=*it-*(--it); printf("%d ",ans-1); } else if(ch=='R') it=s.find(stk[top--]),s.erase(it); } }
2019.04.24