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 4031: [HEOI2015]小Z的房间【矩阵树定理】
是板子题,因为mod不是质数所以需要辗转相除然而并不知道为啥 高斯消元部分还不知道原理呢--先无脑背过的 #include<iostream> #include<cstdio> ...
- gitlab&Jenkins 详细介绍及其应用
第1章 gitlab 1.1 系统环境 [root@jenkins ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...
- 【JS】温故知新: 从parseInt开始
工作中,几乎习惯了大量使用方便的工具库(如underscore.lodash),但是长期的依赖,却有可能在我们注意不到的地方出现黑天鹅,笔者最近就碰到了这样一件例子: parseInt(9e-10); ...
- GitHub安装使用教程
由于重复率比较大,为了尊重他人的成果,先在此注明本文是在学习了以下博文之后的一些总结归纳,并且说明了一些本人实际使用GitHub遇到的问题,并给出了解决办法 .本人的操作系统是window10,所 ...
- CF17C Balance
题意 [题目描述] 一个仅由a,b,c三种字符组成的字符串,可以对其进行如下两种操作: 选择两个相邻字符,将第一个字符替换成第二个. 选择两个相邻字符,将第二个字符替换成第一个. 这样,通过任意多次的 ...
- STL之set和multiset
set是与集合相关的容器,STL为我们提供了set的实现,在编程题中遇见集合问题直接调用是十分方便 SET set模版类的定义在头文件<set>中. 定义set对象的示例代码如下: set ...
- 题解报告:hdu 2588 GCD(欧拉函数)
Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written ...
- 题解报告:hdu 1015 Safecracker
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kl ...
- Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类
Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...
- js jquery 获取服务器控件的三种方法
由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<asp:TextBox ID=" ...