链接:

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. ssh 免密码登录,以及 本地和远端用户名不一致 问题

    ssh 远程登录 ssh -l u1 u1@192.168.0.7 ssh u1@192.168.0.7 每次远程都要输入 用户名,密码 比较麻烦.所以比较好的是免密码登录 1.安装ssh服务器 su ...

  2. tensor flow 安装

    http://blog.csdn.net/nxcxl88/article/details/52704877?locationNum=13 安装后,一定要运行这句话后   $ source activa ...

  3. linux替换字符串的几种方法

    1. 基本替换:s/str1/str2/ 替换当前行第一个str1为str2:s/str1/str2/g 替换当前行所有str1为str2:n,$s/str1/str2/ 替换第 n 行开始到最后一行 ...

  4. Eletron 打开文件夹,截图

    1.shell.openItem(fullPath) var fullpath = path.join(processPath)+Math.random()+".png"; she ...

  5. 在c#下用 WCF编写restful

    1.添加WCF服务库 2.在global里面注册路由 RouteTable.Routes.Add(new ServiceRoute("api", new WebServiceHos ...

  6. SpringCloud 简单理解

    0.SpringCloud,微服务架构.包括 服务发现(Eureka),断路器(Hystrix),服务网关(Zuul),客户端负载均衡(Ribbon).服务跟踪(Sleuth).消息总线(Bus).消 ...

  7. 唯快不破:Web应用的13个优化步骤

    https://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=2651163004&idx=2&sn=2b1be8014abf19 ...

  8. Hook钩子编程

    钩子(Hook),是Windows消息处理机制的一个平台,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统,以监视指定窗口的某种消息.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先 ...

  9. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  10. 16-图片上传那些事 org.springframework.web.multipart.MultipartException: The current request is not a multipart request

    https://blog.csdn.net/u010974598/article/details/46458039 我曾尝试了: @RequestMapping(value="/user/r ...