洛谷 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& ...
随机推荐
- git 常用命令及仓库创建
一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...
- Docker自学纪实(二)Docker基本操作
安装docker 以CentOS7为例: 安装:yum -y install docker 启动:systemctl start docker 设置开机自启:systemctl enable dock ...
- python__标准库 : 测试代码运行时间(timeit)
用 timeit.Timer.timeit() 方法来测试代码的运行时间: from timeit import Timer def t1(): li = [] ): li.append(i) def ...
- js for 循环中有异步函数时,回调函数总是最后一步的值。
原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...
- HyperLedger Fabric 1.4 区块链技术定义(2.1)
区块链技术指使用点对点传输.共识机制.加密算法等技术,保证分布式数据库区块写入链中数据的一致性,达到去中心化和不可篡改的目的. 区块链就是一种特殊的分布式数据库,使用现有的各种成熟的技术, ...
- powershell设置SS代理
$env:HTTPS_PROXY="http://127.0.0.1:1080" $env:HTTP_PROXY="http://127.0.0.1:1080"
- easyui js拼接html,class属性失效的问题
问题:要在前一个按钮之后添加相同的样式的按钮,通过$("#cj").html(str); 这样的形式添加,却不能添加上样式 <div id="btn" c ...
- ACE_DEBUG buffer
ACE中输出日志时,发现太长会被截断. 1.测试 ] = {}; ACE_OS::memset(buf,); ACE_DEBUG((LM_INFO, ACE_TEXT("##@@##[ %s ...
- centos使用--centos7.3配置LNMP
目录 1 源的配置 2 安装软件 2.1 安装php7 2.2 安装nginx 2.3 安装mysql 2.4 安装vsftp (ftp登录配置) 3 开机启动设置 4 其它一些配置 4.1 git的 ...
- 网络策略中使用的 VLAN 属性
TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 按类别提供的 Windows Server 内容 Win ...