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 鬼子进村 解题报告的更多相关文章

  1. 洛谷P1503 鬼子进村 [平衡树,STL]

    题目传送门 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...

  2. 洛谷—— P1503 鬼子进村

    https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的 ...

  3. 洛谷 P1503 鬼子进村

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

  4. 洛谷 P1503鬼子进村

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

  5. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  7. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 1503 鬼子进村 (set)

    /*set加速维护*/ #include<iostream> #include<cstdio> #include<cstring> #include<set& ...

随机推荐

  1. What is EJB

    What is EJB 0.什么是EJB? 答:EJB是用于构建企业应用程序模块托管的.服务器端组件架构.EJB技术加速并简化了开发基于Java技术的分布式.事务性.安全和便携的应用程序. 先看一下E ...

  2. 协程实现tcp两个客户端的通讯

    import socket import gevent from gevent import monkey monkey.patch_all() def cb_work(recv_num,send_n ...

  3. php+MySQL(存储过程) +yii2完整的增删改查

    1在MySQL中创建存储过程 a 我将添加和修改 作为 一起 ), ), ), )) BEGIN FROM t_boss_role WHERE id = _id) THEN UPDATE t_boss ...

  4. JavaSE 第二次学习随笔(作业一)

    package homework2; import java.io.ObjectInputStream.GetField; import java.util.Arrays; public class ...

  5. const用法总结(通俗易懂)

    const的意思可以概括为 “一个不能被改变的普通变量” ,使得const在一定程度上提高程序的安全性和可靠性. const的几种情况: 1. const的普通用法 int const size: c ...

  6. Hive 表数据的存储和压缩格式

    SerDe * 按行存储 * 按列存储 file_format: : | SEQUENCEFILE 序列化(行存储) | TEXTFILE 文本格式(行存储)- (Default, depending ...

  7. 从事IT业一个8年老兵转行前的自我总结1——初爻

    现在,本人已离开这个呆了8年的软件行业了.回想自己从半路出家,从实施开始做起,最终在一家外企做项目经理PM结束了自己的软件职业生涯.从一张白纸的自学开始,做过项目实施,客户培训,拿过需求,开发,架构设 ...

  8. 常用模块(string)

    import string# dt = string.digits # 获取0-9的数字# dt = string.ascii_letters # 获取所有的大小写字母# dt = string.he ...

  9. Python学习1,代码

      看了好久的网上视频,今天尝试着写了一串代码: _author_ = "Happyboy" produce_list = [ ('Iphone',5800), ('Mac Pro ...

  10. 一个初学者的辛酸路程-继续Django

    问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py  ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...