(线段树 区间合并更新)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]内的最长上升子序列. 做法 ...
随机推荐
- node系列:全局与本地
查看:默认和当前的 全局与本地 全局路径:npm config get prefix 本地路径:npm config get cache 修改 修改就会创建对应目录(文件夹) 修改本地路径:npm c ...
- apache commons pool
apache commons下的pool 其中的borrowObject函数源代码显示其产生可用对象的过程: 如果stack中有空闲的对象,则pop对象,激活对象(activate函数),验证对象(v ...
- 输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题
题目的大致意思如下: 输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度: 例如: 输入:6 0 1 0 2 1 3 1 4 2 5 ...
- 根据条件决定是否为input设置只读属性
代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...
- Ansible playbooks
Playbook是Ansible的配置,部署和编排语言. 他们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果Ansible modules是您workshop的工具,则playb ...
- bedtools简介及应用
1)背景处理基因组数据中,比较基因组不同区域,例如寻找overlap等,是一种基本的且常见的问题.虽然UCSC 中‘Table Browser’或者Galaxy可以用来处理,但是当这些工具面对大的数据 ...
- 121. Best Time to Buy and Sell Stock (Array;DP)
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- 条款2:尽量以const, enum, inline替换#define
原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...
- mysql数据库的最基本的命令
#查看mysql有哪些数据库:show databases; 创建一个数据库名称为DataBaseName,字符编码为utf8支持中文create database DataBaseName char ...
- python数据类型内部结构解剖
一.前言 我们知道,python是一种动态语言,可以将任何类型的数据赋给任何变量,譬如: # Python代码 x = 4 x = "four" 这里已经将 x 变量的内容由整型转 ...