链接:

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. 如何将String转换为int

    1. int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); Integer.parseIn ...

  2. RESTORE 无法处理数据库 'Students',因为它正由此会话使用。建议在执行此操作时使用 master 数据库。

    恢复数据库是总弹出报错对话框如下:RESTORE 无法处理数据库 'Students',因为它正由此会话使用.建议在执行此操作时使用 master 数据库.RESTORE DATABASE 正在异常终 ...

  3. java 包的命名规范

  4. Autopilot Pattern Redis

    https://github.com/autopilotpattern/redis Architecture 正在运行的群集包括以下组件: Redis :我们使用的是Redis 3.2. Redis ...

  5. C++ 输入cin 和输出cout

    C++输入cout与输出cin 输入和输出并不是C++语言中的正式组成成分.C和C++本身都没有为输入和输出提供专门的语句结构.输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的. ...

  6. Fragment 生命周期 全局变量的声明位置

    public class Fragment_shouye extends Fragment { private List<Zixun_shouye> datas; private TopV ...

  7. jdeveloper基础教程(中文版)

    jdeveloper基础教程(中文版) 程序员的基础教程:菜鸟程序员

  8. xtrabackup拷贝redolog前做的细节操作

    原文地址:http://www.innomysql.net/article/25590.html 前言 淘宝3月的数据库内核月报对 xtrabackup的备份原理 做了深入的分析,写的还是很不错.不过 ...

  9. iOS.Dev.Support.MultiVersions

    如何利用target conditionals和availabilty 如何来区分平台iOS OR Mac “When building for iOS the deployment target i ...

  10. python中的日志模块logging

    1.日志级别5个: 警告Warning 一般信息Info  调试 Debug  错误Error 致命Critical 2.禁用日志方法 logging.disable(logging.DEBUG) 3 ...