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. Python——列表

    应用场景,要统计大量的人员信息.就可以用列表的形式进行.name = ['邱秀','玄永俊','杨栋豪']查:print(name[2],name[0]) #取号码进行识别print(name[1:3 ...

  2. Ubuntu 下安装GIMP

    1.Add GIMP PPA Open terminal from Unity Dash, App launcher, or via Ctrl+Alt+T shortcut key. When it ...

  3. java数组之二分法查找

    认识: 猜字游戏 步数 所猜的数 结果 可能值的范围 0     1~100 1 50 太高 1~49 2 25 太低 26~49 3 37 太高 26~36 4 31 太低 32~36 5 34 太 ...

  4. 使用Docker 一键部署 LNMP+Redis 环境

    使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  5. python中的集合内置方法小结

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- #集合性质:需要传入一个list,且不含重复的元素,无序 list_1=[1,2,1,4,5,8,3,4 ...

  6. JDK学习---深入理解java中的String

    本文参考资料: 1.<深入理解jvm虚拟机> 2.<大话数据结构>.<大话设计模式> 3.http://www.cnblogs.com/ITtangtang/p/3 ...

  7. Leetcode 538. 把二叉搜索树转换为累加树

    题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...

  8. Android面试收集录18 Android Context详解

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  9. 十二、mysql之视图,触发器,事务等

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  10. 10,python开发之virtualenv与virtualenvwrapper

      在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程 ...