题目大意:

就是给定一堆位置,进行删除还原,最后找到 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. oracle给用户授权

    1.在PLSQL里,用sys(oracle系统用户)登陆,登陆的时候一定要选择SYSDBA.普通用户登陆选择normal就可以了 2.创建用户 *也可以给普通用户授权为dba即数据库管理员.在导入导出 ...

  2. bzoj 4806: 炮【dp】

    同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...

  3. 开车旅行 2012年NOIP全国联赛提高组(倍增+set)

    开车旅行 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小A 和小B决定利用 ...

  4. (前缀和 内存分配)51NOD 1081 子段求和

    给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和.   例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 ...

  5. Get 和 Post 使用篇(1)

    1.Post 请求发送方式 实例: const string sResponseEncoding = "gb2312"; //测试文本信息 string postText = &q ...

  6. 2017青岛网络赛1011 A Cubic number and A Cubic Number

    A Cubic number and A Cubic Number Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/3276 ...

  7. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择

    本文转自:http://blog.bossma.cn/asp_net_mvc/asp-net-mvc-htmlhelper-calendar-datetime-select/ 这里我们扩展HtmlHe ...

  8. C#手机充值系统开发(基于聚合数据)

    说是手机充值系统有点装了,其实就是调用了聚合数据的支付接口,其实挺简单的事 但是我发现博客园竟然没有类似文章,我就个出头鸟把我的代码贡献出来吧 首先说准备工作: 去聚合数据申请账号-添加手机支付的认证 ...

  9. jQuery四叶草菜单效果,跟360杀毒软件差不多

    首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...

  10. Python之数据规整化:清理、转换、合并、重塑

    Python之数据规整化:清理.转换.合并.重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来. pandas.concat可以沿着一条轴将多个对象 ...