P1503
鬼子进村
题目背景
小卡正在新家的客厅中看电视。电视里正在播放放了千八百次依旧重播的《亮剑》,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战。
题目描述
县城里有 \(n\) 个用地道相连的房子,第 \(i\) 个只与第 \(i-1\) 和第 \(i+1\) 个相连。这时有 \(m\) 个消息依次传来:
-
若消息为
D x:鬼子将 \(x\) 号房子摧毁了,地道被堵上。 -
若消息为
R:村民们将鬼子上一个摧毁的房子修复了。 -
若消息为
Q x:有一名士兵被围堵在 \(x\) 号房子中。
李云龙收到信息很紧张,他想知道每一个被围堵的士兵能够到达的房子有几个。
输入格式
第一行两个整数 \(n,m\)。
接下来 \(m\) 行,有如题目所说的三种信息共 \(m\) 条。
输出格式
对于每一个被围堵的士兵,输出该士兵能够到达的房子数。
样例 #1
样例输入 #1
7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4
样例输出 #1
1
0
2
4
提示
\(1\leq n,m\leq 5\times 10^4\)。
若士兵被围堵在摧毁了的房子中,那只能等死了。。。。。。
维护一个set 记录被摧毁了的房子
Q操作相当于找前后继
注意细节
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e4;
int jl[N+5],pt,n,m;
set<int>st;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
st.insert(n+1);
st.insert(0);
while(m--)
{
char op;int x;
cin>>op;
if(op=='D')
{
cin>>x;
jl[++pt]=x;
st.insert(x);
}
if(op=='R')
{
x=jl[pt];
st.erase(x);
pt--;
}
if(op=='Q')
{
cin>>x;
set<int>::iterator it,itt;
it=st.lower_bound(x);
if(*it==x)cout<<0<<"\n";
else
{
itt=it;
itt--;
cout<<*it-(*itt)-1<<"\n";
}
}
}
return 0;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号