题目大意:

就是给定一堆位置,进行删除还原,最后找到 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 区间合并线段树的更多相关文章

  1. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  2. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  3. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  4. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  5. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. HDU 5700 区间交 线段树暴力

    枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...

  7. HDU 1540 Tunnel Warfare (线段树)

    题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...

  8. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  9. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

随机推荐

  1. [C和指针] 6-指针

    6.1 内存和地址 我们可以把计算机的内存看作是一条长街上的一排房屋,每座房子都可以容纳数据,并通过一个房号来标识. 这个比喻颇为有用,但也存在局限性.计算机的内存由以亿万计的位(bit)组成,每个位 ...

  2. 392 Is Subsequence 判断子序列

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列.你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=10 ...

  3. 《编写可维护的Javascript》学习总结

    第一部分 一.基本规范 1.缩进:一般以四个空格为一个缩进. 2.语句结尾:最好加上分号,因为虽然“自动分号插入(ASI)”机制在没有分号的位置会插入分号,但是ASI规则复杂而且会有特殊情况发生 // ...

  4. Spring Boot (28) actuator与spring-boot-admin

    在上一篇中,通过restful api的方式查看信息过于繁琐,也不直观,效率低下.当服务过多的时候看起来就过于麻烦,每个服务都需要调用不同的接口来查看监控信息. SBA SBA全称spring boo ...

  5. WCF学习笔记(2)-WCF的通讯过程

    一.WCF中的ABC 场景:公司让你送一份合同文件,送文件的过程你可以选择的交通方式有打的,地铁或公交. 到了对方公司后,你要找到某负责人,并且要一份收到合同文件的回执和相应文件 要完成这项工作任务主 ...

  6. Java编程思想读书笔记_第8章

    覆盖私有方法 class Father { private void f() { System.out.println("Father::f()"); } public stati ...

  7. 前端--3、jQuery

    介绍 jQuery是一个Javascript框架.其宗旨是——WRITE LESS,DO MORE! 是轻量级的js库,兼容CSS3和各种浏览器. 作用:处理HTMLdocuments.events. ...

  8. 第3章 DOM

    1.节点,dom有3种节点,元素节点,文本节点,属性节点 2.元素节点是dom的原子,所有的属性节点和文本节点都被元素包含,但并不是所有的元素都包含他们 3.继承,节点树上的元素将继承父元素的样式和属 ...

  9. vux+vuex+vue+Es6开发微信公众号的坑

    初次开发微信公众号遇到很多问题,可能是基础不怎么牢靠,最近几天一直在看vue的东西,现在就来慢慢介绍vux和vue这个骚东西的用法: 细看文档一步步来, npm install vux --save ...

  10. Python中的排序方法

    1 list.sort list.sort(key=None, reverse=False) 该方法只能用于list.就地排序,原来的list被修改.key的用法见下文.reverse控制降序还是生序 ...