P1503

鬼子进村

题目背景

小卡正在新家的客厅中看电视。电视里正在播放放了千八百次依旧重播的《亮剑》,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战。

题目描述

县城里有 \(n\) 个用地道相连的房子,第 \(i\) 个只与第 \(i-1\) 和第 \(i+1\) 个相连。这时有 \(m\) 个消息依次传来:

  1. 若消息为 D x:鬼子将 \(x\) 号房子摧毁了,地道被堵上。

  2. 若消息为 R :村民们将鬼子上一个摧毁的房子修复了。

  3. 若消息为 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;
}
posted @ 2023-01-07 14:46  PKU_IMCOMING  阅读(11)  评论(0)    收藏  举报