hdu 1540(线段树区间合并)
题目链接:传送门
参考文章:传送门
题意:n个数字初始连在一条线上,有三种操作,
D x表示x号被摧毁;
R 表示恢复剩下的通路
Q表示查询标号为x所在的串的最长长度。
思路:线段树的区间合并。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
struct Node{
int l,r;
int ls,rs,ms;
}cur[maxn<<];
int ss[maxn],m,n;
void build(int x,int l,int r) //初始化建树
{
cur[x].l=l;cur[x].r=r;
cur[x].ls=cur[x].rs=cur[x].ms=r-l+;
if(l==r) return ;
int mid=(l+r)>>;
build(x*,l,mid);
build(x*+,mid+,r);
}
int MAX(int x,int y)
{
return x>y?x:y;
}
void update(int x,int pos,int fg)
{
if(cur[x].l==cur[x].r)
{
if(fg==) cur[x].ls=cur[x].rs=cur[x].ms=; //删除
else cur[x].ls=cur[x].rs=cur[x].ms=; //更新
return ;
}
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid) update(x*,pos,fg);
else update(x*+,pos,fg);
//pushup操作,更新左子区间,右子区间的最长长度
cur[x].ls=cur[x*].ls;
cur[x].rs=cur[x*+].rs;
cur[x].ms=MAX(MAX(cur[x*].ms,cur[x*+].ms),cur[x*].rs+cur[x*+].ls);
if(cur[x*].ls==cur[x*].r-cur[x*].l+) cur[x].ls+=cur[x*+].ls; //如果区间的左子树的左区间已经满了,就加上右子树的左子区间
if(cur[x*+].rs==cur[x*+].r-cur[x*+].l+) cur[x].rs+=cur[x*].rs; // 如果右子树的右子区间已经满了,就加上左子树的右子区间
}
int query(int x,int pos)
{
if(cur[x].ms==||cur[x].l==cur[x].r||cur[x].ms==cur[x].r-cur[x].l+) return cur[x].ms;
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid)
{
if(pos>=cur[x*].r-cur[x*].rs+) return query(x*,pos)+query(x*+,mid+);//如果在左子区间的右边界,就遍历两个区间
return query(x*,pos);
}
else
{
if(pos<=cur[x*+].l+cur[x*+].ls-) return query(x*+,pos)+query(x*,mid); //如果在右子区间的左边界,就遍历两个区间
return query(x*+,pos);
}
}
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
build(,,n);
char op[];
int x,top=;
while(m--)
{
scanf("%s",op);
if(op[]=='D')
{
scanf("%d",&x);
ss[top++]=x;
update(,x,);
}
else if(op[]=='Q')
{
scanf("%d",&x);
printf("%d\n",query(,x));
}
else if(op[]=='R')
{
x=ss[--top];
update(,x,);
}
}
}
return ;
}
hdu 1540(线段树区间合并)的更多相关文章
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU - 1540 线段树的合并
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3911 线段树区间合并
北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...
- hdu 1806(线段树区间合并)
Frequent values Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 3308 线段树 区间合并+单点更新+区间查询
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- hdu 3911 Black And White (线段树 区间合并)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
随机推荐
- 转:WCAT 压力工具介绍
原文地址:http://blogs.msdn.com/alikl/archive/2008/03/09/stress-test-asp-net-web-application-with-free-wc ...
- [Java学习]反射机制(待续226)
反射机制相关的类.反射机制的作用 获取Class类型对象的三种方式
- delete[] p与 delete p
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的:但是对于类对象数组,只能用 delete[].对于 new 的单个对象,只能用 del ...
- LRU缓存原理
LRU(Least Recently Used) LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象. 采用LRU算法的缓存有两种:LrhCache和DisL ...
- 针对appium的webdriver执行swipe无效的解决办法
self.driver.swipe(x1,y1,x2,y1,t) 当时代码里有如上这么一句,当时源码是这么说的: # convenience method added to Appium (NOT S ...
- BCH/BCHABC/BCHSV分叉后重放机制小结
1. 不过,在谈重放保护之前,我们需要先了解一下重放攻击(又称重播攻击.回放攻击).实际上,重放攻击在互联网行业里就有过出现,也是计算机世界黑客最常用的攻击方式之一,它是指攻击者发送一个目的主机已接收 ...
- Ubuntu1.6安装Go【小白版】
[安装golang,并配置环境变量]1.将go下载到Home目录并解压 一键解压会 自动会解压到 Home/go目录. 2.设置环境变量 nano是一种文本编辑器,也可以用其他的编辑器. 输入以下命令 ...
- Django 导入css文件,样式不起作用。Resource interpreted as Stylesheet but transferred with MIME type application/x-css
笔者今天在模板中加载css文件时,发现 css样式能够下载再来却无法起作用,而且,图片.js都能够正常使用. 并且 浏览器提示: Resource interpreted as Stylesheet ...
- 9.13 h5日记
9.13 面试题 为什么两个P出此案的效果不同,原因是 浏览器在解析第二个P的时候,因为字母没有空格,浏览器会认为这个单词没有打完,所以不会换行. 列表 ul ol dl li 1.无序列表 ul ( ...
- 解决sublime3不能编辑插件default settings的问题
一.遇见问题 今天给sublime安装了View In Browser,想更改一下默认启动的浏览器 preferences-Package settings-View In Browser-setti ...