洛谷 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
说明
若士兵被围堵在摧毁了的房子中,那只能等死了。。。。。。
思路:对于第一种操作,我们可以开一个vis数组记录某个地洞是否被堵了,同时要把堵了的地洞加入一个栈,为后面的第二种操作做准备,第二种操作,直接就把栈顶元素弹出来就好了,再把相应的vis数组清空,但是,第三种操作,貌似有些棘手,但是,我们仔细想一下,被困队员能到达的地洞可以认为是一个线性的数列,也就是说,是有左右边界的,而左右边界又正好是这个被困队员所在的被堵洞口的前驱和后继!用splay来维护一下就可以解决了!
代码:
#include<cstdio>
#include<cctype>
#include<stack>
#define maxn 50007
using namespace std;
int n,m,root,tot;
char c[2];
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';
return num*f;
}
bool vis[maxn];
struct Tree {
int fa,ch[2],val;
}t[maxn];
inline void rotate(int x) {
int y=t[x].fa,z=t[y].fa;
int k=t[y].ch[1]==x;
t[z].ch[t[z].ch[1]==y]=x;
t[x].fa=z;
t[y].ch[k]=t[x].ch[k^1];
t[t[x].ch[k^1]].fa=y;
t[x].ch[k^1]=y,t[y].fa=x;
}
inline void splay(int x, int rt) {
while(t[x].fa!=rt) {
int y=t[x].fa,z=t[y].fa;
if(z!=rt) (t[y].ch[0]==x)^(t[z].ch[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(!rt) root=x;
}
inline void insert(int x) {
int u=root,f=0;
while(u&&t[u].val!=x) {
f=u;
u=t[u].ch[x>t[u].val];
}
if(u);
else {
u=++tot;
if(f) t[f].ch[x>t[f].val]=u;
t[u].fa=f,t[u].val=x;
}
splay(u,0);
}
inline void find(int x) {
int u=root;
if(!u) return;
while(t[u].ch[x>t[u].val]&&x!=t[u].val) u=t[u].ch[x>t[u].val];
splay(u,0);
}
inline int nxt(int x, int f) {
find(x);
int u=root;
if(t[u].val>x&&f) return u;
if(t[u].val<x&&!f) return u;
u=t[u].ch[f];
while(t[u].ch[f^1]) u=t[u].ch[f^1];
return u;
}
inline void sc(int x) {
int last=nxt(x,0),next=nxt(x,1);
splay(last,0),splay(next,last);
t[next].ch[0]=0;
}
stack<int>q;
int main() {
n=qread(),m=qread();
insert(0),insert(n+1);
for(int i=1,x;i<=m;++i) {
scanf("%s",c);
if(c[0]=='D') {
x=qread(),vis[x]=1;
q.push(x),insert(x);
}
if(c[0]=='R') {
vis[q.top()]=0;
sc(q.top());
q.pop();
}
if(c[0]=='Q') {
x=qread();
if(vis[x]) printf("0\n");
else printf("%d\n",t[nxt(x,1)].val-t[nxt(x,0)].val-1);
}
}
return 0;
}
洛谷 P1503 鬼子进村的更多相关文章
- 洛谷 P1503 鬼子进村 解题报告
P1503 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...
- 洛谷P1503 鬼子进村 [平衡树,STL]
题目传送门 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...
- 洛谷—— P1503 鬼子进村
https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的 ...
- 洛谷 P1503鬼子进村
题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...
- 洛谷 1503 鬼子进村 (set)
/*set加速维护*/ #include<iostream> #include<cstdio> #include<cstring> #include<set& ...
- P1503 鬼子进村
题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...
- 【题解】Luogu P1503 鬼子进村
平衡树好题 原题传送门 这道题要用Splay,我博客里有对Splay的详细介绍 这道题思维有点难,要把被摧毁的节点插入平衡树,而不是把没有摧毁的节点插入 先把0和n+1插入平衡树,作为边界 操作1:摧 ...
- luogu P1503 鬼子进村
嘟嘟嘟 线段树好题. 其实挺水的,想暴力怎么做:每一次从这个点开始向两边扩,直到遇到第一个摧毁的房屋. 那么把暴力改成倍增,然后线段树查询区间和是否为0.时间复杂度O(nlog2n). 题解好像有线段 ...
- Luogu P1503 鬼子进村 set
还是拿set搞... 用set记录每个被摧毁的位置,Q的时候二分一下,在和上一个摧毁的位置减一下,即可求出能到的房子数 #include<iostream> #include<cst ...
随机推荐
- OSCache-缓存过滤器CacheFilter
用CashFilter实现页面级缓存. 在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存,主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成pdf格式文件/报表 ...
- windows 使用命令打开防火墙的端口
Open TCP Port 80 in Windows Firewall Using Netsh [McNeel Wiki]https://wiki.mcneel.com/zoo/zoo5netsh ...
- inux php pdo mysql 扩展
今天在本机部署了一个pdo项目,发现一些问题,真没想到pdo mysql,不容易装啊,哈哈,我说的不容易,是因为php5.3以前版本,yum源里面根本没有.部署后就报,Undefined class ...
- laravel 队列
php artisan queue:table 先创建job 队列表 php artisan migrate 执行表 php artisan make:job SendMessage 创建一个job ...
- Java IO简介
-------------siwuxie095 Java IO简介: IO 也写作"I/O",可理解为 In 和 Out,即 输入 与 输出 ...
- 在Win7 64位电脑上安装Sql Server 2008 R2 Express
安装环境说明: 操作系统:Win7 64位 英文版 安装步骤: 1.准备安装文件 下载网址:https://www.microsoft.com/zh-CN/download/details.aspx? ...
- caret 分类回归树 用法
http://topepo.github.io/caret/feature-selection-overview.html
- Ajax——三种数据传输格式
一.HTML HTML由一些普通文本组成.如果服务器通过XMLHTTPRequest发送HTML,文本将存储在responseText属性中. 从服务器端发送的HTML的代码在浏览器端不需要用Java ...
- 基于.Net平台常用的组件和框架整理
转载自:http://www.cnblogs.com/hgmyz/p/5313983.html 基于转载进行补充 RPC框架: RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而 ...
- Dapper多表查询
1对1 //文章 public class Post { public int ID { get; set; } public string Title { get; set; } public st ...