洛谷 P1503 鬼子进村 解题报告
P1503 鬼子进村
题目背景
小卡正在新家的客厅中看电视。电视里正在播放放了千八百次依旧重播的《亮剑》,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战。
题目描述
描述 县城里有\(n\)个用地道相连的房子,第\(i\)个只与第\(i-1\)和第\(i+1\)个相连。这是有\(m\)个消息依次传来
1、消息为\(D\) \(x\):鬼子将\(x\)号房子摧毁了,地道被堵上。
2、消息为\(R\) :村民们将鬼子上一个摧毁的房子修复了。
3、消息为\(Q\) \(x\):有一名士兵被围堵在\(x\)号房子中。
李云龙收到信息很紧张,他想知道每一个被围堵的士兵能够到达的房子有几个。
输入输出格式
输入格式:
第一行2个整数\(n\),\(m\) \((n,m \le 50000)\)。
接下来\(m\)行,有如题目所说的三种信息共\(m\)条。
输出格式:
对于每一个被围堵的士兵,输出该士兵能够到达的房子数。
说明
若士兵被围堵在摧毁了的房子中,那只能等死了。。。。。。
这道题方法好多啊QAQ
提供一种点分裂合并的平衡树做法
平衡树每个节点维护一个\(segl\)和一个\(segr\),表示这个节点所代表的连续区间
这样我们在询问的时候只需要找到对应的点,看看这个点有多大就行了
对于删除,我们直接找到点,然后分情况把这个点分裂掉删掉就行了
对于修改,我们塞进去的时候看看可不可以和左右节点进行合并,如果可以,就把节点合并成一个
事实上实现起来有些麻烦,我用的是fhqtreap,写起来还算方便叭
Code:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define ls ch[now][0]
#define rs ch[now][1]
const int N=1e5+10;
int ch[N][2],segl[N],segr[N],val[N],tot,root,s[N],n,m,tot0,in[N];
void split(int now,int k,int &x,int &y)
{
if(!now){x=y=0;return;}
if(k>=segl[now])
x=now,split(rs,k,rs,y);
else
y=now,split(ls,k,x,ls);
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]<val[y])
{
ch[x][1]=Merge(ch[x][1],y);
return x;
}
else
{
ch[y][0]=Merge(x,ch[y][0]);
return y;
}
}
int New(int l,int r)
{
val[++tot]=rand(),segl[tot]=l,segr[tot]=r;
return tot;
}
void Insert(int k)
{
int x,y,z;
in[k]=0;
split(root,k,x,y);
split(y,k+1,z,y);
int now=x;while(rs) now=rs;
if(segr[now]==k-1)
{
++segr[now];
if(segr[now]==segl[z]-1)
{
segr[now]=segr[z];
root=Merge(x,y);//三个全合并
}
else
root=Merge(x,Merge(z,y));
}
else if(k==segl[z]-1)
{
--segl[z];
root=Merge(x,Merge(z,y));
}
else
root=Merge(Merge(x,New(k,k)),Merge(z,y));
}
int query(int k)
{
int x,y,ans,now;
split(root,k,x,y);
now=x;while(rs) now=rs;
ans=segr[now]+1-segl[now];
root=Merge(x,y);
return ans;
}
void destroy(int k)
{
int x,y,z;
in[k]=1;
split(root,k,x,y);
int now=x,rr;while(rs) now=rs;
rr=segr[now];
if(segl[now]==segr[now]) split(x,segl[now]-1,x,z);
else segr[now]=k-1;
if(k<rr) x=Merge(x,New(k+1,rr));
root=Merge(x,y);
}
int main()
{
scanf("%d%d",&n,&m);
root=New(1,n);
char op[3];
for(int x,i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='D')
{
scanf("%d",&x);
destroy(s[++tot0]=x);
}
else if(op[0]=='R')
Insert(s[tot0--]);
else
{
scanf("%d",&x);
if(in[x]) printf("0\n");
else printf("%d\n",query(x));
}
}
return 0;
}
2018.9.6
洛谷 P1503 鬼子进村 解题报告的更多相关文章
- 洛谷P1503 鬼子进村 [平衡树,STL]
题目传送门 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...
- 洛谷—— P1503 鬼子进村
https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的 ...
- 洛谷 P1503 鬼子进村
题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...
- 洛谷 P1503鬼子进村
题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 1503 鬼子进村 (set)
/*set加速维护*/ #include<iostream> #include<cstdio> #include<cstring> #include<set& ...
随机推荐
- Redis高可用
redis高可用只要在于三个方面 主从复制 哨兵机制 集群机制 主从复制 主从复制作用: 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.2.故障恢复:当主节点出现问题时,可 ...
- Python变量、赋值及作用域
## 变量 - 指向唯一内存地址的一个名字 - 目的是为了更方便地引用内存中的值 - 可以使用id(变量)函数来查看变量的唯一id值,若两者id值相同,则表示两个变量指向同一地址,两个变量的值完全相同 ...
- javascript 运行机制 事件循环 浏览器缓存 (慕课网 前段跳槽面试必备 4-1,4-2,4-3)
4-1 渲染机制:-1-,什么是DOCTYPE及其作用?DTD(document type definition,文档类型定义)是一系列的语法规则,用来定义XML或(X)HTML的文件类型,浏览器会使 ...
- php图片压缩-高清晰度
php高清晰度无损压缩 经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢? 压缩通常是有按比例缩放,和指定宽度压 ...
- 蓝桥杯-历届试题 剪格子(dfs)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--**** ...
- HDU 3364 高斯消元
Lanterns Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...
- 4 Django简介
MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...
- C#冒泡算法复习
C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...
- __bridge 使用注意
前奏 在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙 注意 : 如果是使用 CF __bridge ...