HDU 1540 Tunnel Warfare (线段树)
Tunnel Warfare
Frequently the invaders launched attack on some of the villages and destroyed the parts of tunnels in them. The Eighth Route Army commanders requested the latest connection state of the tunnels and villages. If some villages are severely isolated, restoration of connection must be done immediately!
There are three different events described in different format shown below:
D x: The x-th village was destroyed.
Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.
R: The village destroyed last was rebuilt.
Q
R
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stack> using namespace std;
const int maxn = ;
struct node{
int l,r;
int ls,rs,ms;//ls左端最大连续区间,rs右边最大连续区间,ms最大连续区间
}sum[maxn<<];
void build(int l,int r,int rt)
{
sum[rt].l=l;sum[rt].r=r;
sum[rt].ls=sum[rt].rs=sum[rt].ms=(r-l+);
if(l!=r){
int mid = (l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
}
void update(int L,int R,int rt)
{
if(sum[rt].l==sum[rt].r){//单点更新操作的村庄
if(R==)
sum[rt].ls = sum[rt].rs = sum[rt].ms = ;
else
sum[rt].ls = sum[rt].rs = sum[rt].ms = ;
return;
}
int mid = (sum[rt].l+sum[rt].r)>>;
if(L<=mid) update(L,R,rt<<);//向左边找
else update(L,R,rt<<|);//右边找
//更新子区间之后再更新当前的区间
sum[rt].ls = sum[rt<<].ls;
sum[rt].rs = sum[rt<<|].rs;
sum[rt].ms = max(max(sum[rt<<].ms,sum[rt<<|].ms),sum[rt<<].rs+sum[rt<<|].ls);
if(sum[rt<<].ls==sum[rt<<].r-sum[rt<<].l+)//如果左子树满了需要加上右子树的左区间
sum[rt].ls += sum[rt<<|].ls;
if(sum[rt<<|].rs==sum[rt<<|].r-sum[rt<<|].l+)//同理
sum[rt].rs += sum[rt<<].rs;
}
int query(int L,int rt)
{
if(sum[rt].l==sum[rt].r||sum[rt].ms==||sum[rt].ms==(sum[rt].r-sum[rt].l+))
return sum[rt].ms;//返回的条件
int mid = (sum[rt].l+sum[rt].r)>>;
if(L<=mid){//如果要查的点再mid的左子树
if(L>=sum[rt<<].r-sum[rt<<].rs+)return query(L,rt<<)+query(mid+,rt<<|);//左区间已满需要加上右子树的左边
else return query(L,rt<<);//左子树未满,只需要加左子树的值
}else{
if(L<=sum[rt<<|].l+sum[rt<<|].ls-)return query(L,rt<<|)+query(mid,rt<<);//同理
else query(L,rt<<|);
}
}
int main()
{
int n,m,x;char op;
while(scanf("%d%d",&n,&m)!=EOF){
stack<int>Q;
build(,n,);
while(m--){
scanf(" %c",&op);//去掉行末换行符的影响
if(op=='D'){
scanf("%d",&x);
Q.push(x);
update(x,,);
}else if(op=='Q'){
scanf("%d",&x);
printf("%d\n",query(x,));
}else if(op=='R'){
if(!Q.empty()&&x>){
update(Q.top(),,);
Q.pop();
}
}
}
}
return ;
}
HDU 1540 Tunnel Warfare (线段树)的更多相关文章
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare(线段树区间统计)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- hdu 1540 Tunnel Warfare 线段数区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- kubernetes1.4新特性:支持sysctl命令
背景介绍 sysctl是一个允许改变正在运行中的Linux系统内核参数的接口.可以通过sysctl修改Linux系统内核中的TCP/IP 堆栈和虚拟内存系统的高级选项,而且不需要重新启动Linux系统 ...
- Emacs用JDEE编写Android程序
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/sheismylife/article/details/24842669 前文介绍了怎样用Maven构 ...
- objectarx之画多段线和画直线
void CCommonFuntion::DrowPloyLine(AcGePoint2dArray& inputpoints){ if (inputpoints.length() < ...
- DHCP服务器安装、测试
df:disk free df -h 查询空余磁盘 find / -name TechSungWeiXin 查询TechSungWeiXin的位置 find / -name YunyueWeixin_ ...
- srand函数
srand函数是随机数发生器的初始化函数. 原型: void srand(unsigned seed); 用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会 ...
- 2017校赛 问题 F: 懒人得多动脑
题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...
- SqlSugar 笔记
分组: 日期分组一: var result = await temp .GroupBy("date_format(Day,'%Y-%m')") .Select(s => ne ...
- python 利用抛出异常并处理的优点
- 阿里云OSS同城冗余存储正式商业化,提供云上同城容灾能力
近日,阿里云正式发布OSS同城冗余存储产品.这是国内目前提供同城多AZ冗余部署能力覆盖最广的云上对象存储产品,可以实现云存储的同城双活,满足企业级客户对于“发生机房级灾难事件时数据不丢失,业务不中断” ...
- phpexcel使用说明3
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...