(线段树 区间合并更新)Tunnel Warfare --hdu --1540
链接:
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的更多相关文章
- 【线段树区间合并】HDU1540-Tunnel Warfare
一.题目 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
- E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并
E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- hdu 3911 Black And White (线段树 区间合并)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3308 (线段树区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作 : 1 修改 单点 a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...
随机推荐
- 如何使用Python画地图数据
http://blog.csdn.net/wen_fei/article/details/78355699
- 内核线程和用户线程(SMP)
用户级和内核级线程 用户级线程:任何应用程序都可以通过使用线程库设计成多线程程序.线程库是用于用户级线程管理的一个例程句,它包含用于创建和销毁线程的代码.在线程间传递消息和数据的代码.调度线程执行的代 ...
- conductor 事件处理程序
Introduction conductor中的事件提供工作流之间的松散耦合,并支持从外部系统生成和消耗事件. 包括: 1. 能够在外部系统像SQS或Conductor内部生成一个事件(消息). 2. ...
- Eclipse安装教程
Eclipse安装教程 (Win7_64bit + Eclipse_64bit + JDK_8u131_64bit + python2.7.8 + PyDev5.7.0插件) 适用操作系统:W ...
- 转-git 配置用户名和邮箱
原址:http://www.cnblogs.com/fsong/p/5540840.html 在安装了git for windows之后,个人总是忘记配置git config的命令,以此记录一下: 配 ...
- 参数错误导致bug
1.网站参数与数据库参数名字不一致(大小写). 2.参数漏掉一个字母(characterno写成了charaterno).
- poj1417(带权并查集+背包DP+路径回溯)
题目链接:http://poj.org/problem;jsessionid=8C1721AF1C7E94E125535692CDB6216C?id=1417 题意:有p1个天使,p2个恶魔,天使只说 ...
- Codeforces Beta Round #12 (Div 2 Only)
Codeforces Beta Round #12 (Div 2 Only) http://codeforces.com/contest/12 A 水题 #include<bits/stdc++ ...
- tcp连接需要注意的问题
当有子进程时,子进程终止时会返回SIGCHLD信号,默认忽略,此时会有僵尸进程. 处理方法: 捕获信号,并waitpid. 当慢系统调用被中断时(如信号中断),有些系统不会自动重启调用,此时系统调用可 ...
- js this pointer 指针
this JavaScript的函数内部如果调用了this,那么这个this到底指向谁? 答案是,视情况而定! 如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的 ...