HDU 1540 区间合并线段树
题目大意:
就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int N = ; struct Node{
int l , r , ml , mr , ma; //ml左最长,mr右最长,ma总最长
}tree[N<<]; void build(int o , int l , int r)
{
tree[o].l = l;
tree[o].r = r;
tree[o].ml = r - l + ;
tree[o].mr = r - l + ;
tree[o].ma = r - l + ;
int m = (l + r) / ;
if(l == r) return ;
build(o<< , l , m);
build(o<<| , m+ , r);
} void push_up(int o)
{
int ls = o<< , rs = o<<|;
tree[o].ml = tree[ls].ml;
tree[o].mr = tree[rs].mr; if(tree[ls].ml == (tree[ls].r - tree[ls].l + ))
tree[o].ml = tree[ls].ml + tree[rs].ml; if(tree[rs].mr == (tree[rs].r - tree[rs].l + ))
tree[o].mr = tree[ls].mr + tree[rs].mr; tree[o].ma = max(tree[ls].mr + tree[rs].ml , tree[rs].ma);
tree[o].ma = max(tree[ls].ma , tree[o].ma);
} void update(int o , int t , int v)
{
if(tree[o].l == tree[o].r){
if(v == ) tree[o].ma = tree[o].ml = tree[o].mr = ;
else tree[o].ma = tree[o].ml = tree[o].mr = ;
return ;
}
int ls = o<< , rs = o<<|;
int m = (tree[o].l + tree[o].r) / ; if(t <= m) update(ls , t , v);
else update(rs , t , v);
//要等下层更新完才能递归回去更新上层
push_up(o);
} int query(int o , int t)
{
int ls = o<< , rs = o<<| , m = (tree[o].l + tree[o].r) / ;
if(tree[o].l == tree[o].r || tree[o].ma == || tree[o].ma == tree[o].r - tree[o].l + )
return tree[o].ma; if(t <= m){
/*此时t属于左子树,那么存在t只属于左子树区间,和属于左右子树合并的区间
,弱属于合并的区间,那么要保证,t到左子树右端点形成的连续的个数要小于
左子树最大右端连续和
也就是 m - t + 1 <= tree[ls].mr (这里m也等于tree[ls].r)
*/
if(t >= tree[ls].r - tree[ls].mr + )
return query(ls , t) + query(rs , m+);
else return query(ls , t);
}else{
if(t <= tree[rs].l + tree[rs].ml - )
return query(ls , m) + query(rs , t);
else query(rs , t);
}
} int que[N] , top; int main()
{
// freopen("a.in" , "r" , stdin);
int n,m;
char str[];
int x;
while(scanf("%d%d",&n,&m)!=EOF){
build(,,n);
top=;
while(m--)
{
scanf("%s",str);
if(str[]=='D'){
scanf("%d",&x);
que[top++]=x;
update(,x,);
}
else if(str[]=='Q'){
scanf("%d",&x);
printf("%d\n",query(,x));
}
else{
if(x>){
x=que[--top];
update(,x,);
}
}
}
}
return ;
}
HDU 1540 区间合并线段树的更多相关文章
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Tunnel Warfare HDU 1540 区间合并+最大最小值
Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...
- 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 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU 1540 Tunnel Warfare (线段树)
Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
随机推荐
- bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】
我太菜了居然调了一上午-- 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环->dp找每个环点最远能到达距离作为点权->复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更 ...
- [Swift通天遁地]一、超级工具-(20)图片面部聚焦:使图像视图自动聚焦图片人物的面部位置
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- RHEL5.6更新yum源
RHEL5.6更新yum源记录,2017年2月20日 root用户切换目录至:/etc/yum.repos.d/ [root@localhost yum.repos.d]# pwd /etc/yum. ...
- 数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension Req ...
- pip安装itchat模块成功后annocanda中No module named 'itchat'
在cmd中pip install itchat 成功后在annocanda中却出现了下面的情况: 经过查找网上各种查询,原来pip默认是把东西安装在系统python环境中,即C:\Python27\L ...
- Java 8 (3) Stream 流 - 简介
什么是流? 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语言来表达,而不是临时编写一个实现).就现在来说你可以先把它当做是一个遍历数据集的高级迭代器.此外,流还支持并行,你 ...
- 高性能队列disruptor为什么这么快?
背景 Disruptor是LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能支撑每秒600万 ...
- LN : leetcode 3 Longest Substring Without Repeating Characters
lc 3 Longest Substring Without Repeating Characters 3 Longest Substring Without Repeating Characters ...
- 解决安装androidstudio无法查看源代码的问题
如果androidstudio的sdk是自己导入的,则可能会有查看不了源代码的原因.原因是默认目录中没有这个api的源代码. 1.先在C:\Users\xxx\.AndroidStudio2.3\co ...
- 网络编程基础_3.APC队列
APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...