链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1540

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/

题意:

1. D代表删除一个 X 点

2. R代表修复最近删除的点

3. Q查询 X 点上能连接村庄的个数

就说过节点上存的东西很重要,但我还是没很够很好的掌握节点上的东西,这重要的一点,以后一定要注意,如果节点上没存与答案相关的东西,我肯定写的是有问题的,这个题刚开始没怎么懂,自己写的时候在建树的时候居然只在叶子节点里面存东西,这显然是不和常理的,因次,自己写不出来也是正常,有的时候都不知道在节点里面到底要存些什么,以后要多多注意,多多思考。重要的东西强调三遍:节点里存的东西很重要! 节点里存的东西很重要! 节点里存的东西很重要!!!

真心不会这种区间合并更新的题, 好好学习一下, 可代码也不好看懂, 还是慢慢看吧!

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; #define Lson r<<1
#define Rson r<<1|1
#define mid a[r].Mid() const int N = ; struct node
{
int L, R;
int Lsum, Rsum, sum; // sum代表区间最大的连续区间, Lsum代表左端能到达最右端的个数
int Mid() {return (R+L)>>;}
int len() {return (R-L+);}
}a[N<<]; int n, destroyed[N], k; void BuildTree(int r, int L, int R)
{
a[r].L=L, a[r].R=R;
a[r].Lsum = a[r].Rsum = a[r].sum = a[r].len(); if(L==R) return ; BuildTree(Lson, L, mid);
BuildTree(Rson, mid+, R);
} void UpDate(int r)
{
a[r].Lsum = a[Lson].Lsum, a[r].Rsum = a[Rson].Rsum; if(a[Lson].Lsum==a[Lson].len())
a[r].Lsum = a[Lson].Lsum + a[Rson].Lsum; if(a[Rson].Rsum==a[Rson].len())
a[r].Rsum = a[Rson].Rsum +a[Lson].Rsum; a[r].sum = max(a[r].Lsum, max(a[r].Rsum, a[Lson].Rsum+a[Rson].Lsum));
} void Insert(int r, int i, int e)
{
if(a[r].L==a[r].R)
{
a[r].Lsum = a[r].Rsum = a[r].sum = e;
return ;
} if(i<=mid)
Insert(Lson, i, e);
else if(i>mid)
Insert(Rson, i, e); UpDate(r);
} int Query(int r, int k)
{
if(a[r].sum==) return ;
if(k<a[r].L+a[r].Lsum) return a[r].Lsum; //判断是否在左边
if(k>a[r].R-a[r].Rsum) return a[r].Rsum; //判断是否在右边
if(k>a[Lson].R-a[Lson].Rsum && k<a[Rson].L+a[Rson].Lsum) //判断是否在中间
return a[Lson].Rsum + a[Rson].Lsum; if(k<=mid)
return Query(Lson, k);
else
return Query(Rson, k);
} int main()
{
int m;
char s[]; while(scanf("%d%d", &n, &m)!=EOF)
{
int i, x; k=;
BuildTree(, , n); for(i=; i<m; i++)
{
scanf("%s", s);
if(s[]=='D')
{
k++;
scanf("%d", &x);
destroyed[k] = x;
Insert(, x, );
}
else if(s[]=='Q')
{
scanf("%d", &x);
printf("%d\n", Query(, x));
}
else
{
Insert(, destroyed[k], );
k--;
}
}
}
return ;
}

(线段树 区间合并更新)Tunnel Warfare --hdu --1540的更多相关文章

  1. 【线段树区间合并】HDU1540-Tunnel Warfare

    一.题目 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  2. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  3. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  4. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  5. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  6. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  7. hdu 3911 Black And White (线段树 区间合并)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...

  8. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU 3308 (线段树区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作  : 1 修改 单点  a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...

随机推荐

  1. unity 返回子对象组件

    Component[] GetComponentsInChildren(Type t, bool includeInactive = false); //includeInactive: 是否查找非激 ...

  2. 迷你MVVM框架 avalonjs 学习教程17、avalon的一些配置项

    本章节,主要是介绍avalon.config方法,通过它来制定一些更贴心的功能. 一般情况下,我们在使用ms-controller绑定时,需要添加一个ms-controller类名,目的是为了防止网速 ...

  3. homewor

    <jsp;include>动作和指令的区别: 一:执行时间上: <%@ include file=”relativeURI”%>                   是在翻译阶 ...

  4. SQLserver和oracle中对应的数据类型

  5. for循环语句输出菱形

    for(int a = 5; a > 0 ; a--){ for(int b = 1; b <= a; b++){ System.out.print(" "); } f ...

  6. myeclipse 10激活,本人已测试过可行

    激活步骤: 下载myeclipse 10硬解程序包: ed2k://|file|%5Bmyeclipse.10.0.%E6%9B%B4%E6%96%B0%E5%8F%91%E5%B8%83%28%E7 ...

  7. 注册google账号 解决国内手机注册失败的问题

    1. PC端下载夜神安卓模拟器.安装,启动. 2. 在模拟器里的市场应用里下载qq邮箱. 3. 启动邮箱,选择gmail,注册.后续一切顺利. 这是迄今为止,唯一注册顺利的方法.其他方法,手机验证一关 ...

  8. 全排列12 · Permutations

    无重复 [抄题]: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have ...

  9. OC 线程操作 - GCD快速迭代

    - (void)forDemo{ //全都是在主线程操作的 ; i<; i++) { NSLog(@"--%@", [NSThread currentThread]); } ...

  10. dede后台一片空白

    原因是你修改了后台的数据库连接信息文件data/common.inc.php,保存的后文件编码并不是utf-8,而是变成了ANSI或utf-8 + bom的. 解决方法: 用editplus或note ...