Tunnel Warfare--- hdu1540 线段树求连续子区间
题意:有n个村庄,编号分别为1-n;由于战争会破坏村庄,但是我们也会修复;
D x代表村庄x被破坏;
Q x是求与x相连的有几个没有被破坏;
R 是修复最后一次被破坏的村庄;
接下来有m个操作,对于每次Q操作输出结果;
由于修复的是最后一次被破坏的所以要用stack
接下来看代码吧,加个图好理解一点

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std; #define INF 0xfffffff
#define N 50050
#define Lson r<<1
#define Rson r<<1|1 struct SegmentTree
{
int L, R, sum, lsum, rsum; int Mid() { return (L+R)>>;}
int len() { return R-L+; } } a[N<<]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;
a[r].sum = a[r].lsum = a[r].rsum = a[r].len();///刚开始的时候一定是区间所在长度;
if(L == R) return;
Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+, R);
} void Up(int r)///当下面的节点发生变化的时候我们要往上不断更新
{
a[r].lsum = a[Lson].lsum;
a[r].rsum = a[Rson].rsum; if(a[r].lsum == a[Lson].len())
a[r].lsum += a[Rson].lsum;
if(a[r].rsum == a[Rson].len())
a[r].rsum += a[Lson].rsum; a[r].sum = max(max(a[Lson].lsum, a[Rson].rsum),a[Lson].rsum+a[Rson].lsum);
} void Update(int r, int pos, int flag)///flag 为0表示破坏,1表示修复;
{///因为是直接更新到叶子节点的所以不需再往下更新,但是要往上更新;
if(a[r].L == a[r].R && a[r].L==pos)
{
a[r].sum = a[r].lsum = a[r].rsum = flag;
return ;
} if(pos <= a[r].Mid())
Update(Lson, pos, flag);
else if(pos > a[r].Mid())
Update(Rson, pos, flag); Up(r);
} int Query(int r, int pos)
{
if(a[r].sum == )return ; if(pos < a[r].L + a[r].lsum) return a[r].lsum;///在最左边
if(pos > a[r].R - a[r].rsum) return a[r].rsum;///在最右边 if(pos > a[Lson].R - a[Lson].rsum && pos < a[Rson].L + a[Rson].lsum )///在中间部分;
return a[Lson].rsum + a[Rson].lsum; if(pos <= a[r].Mid()) return Query(Lson, pos);///在左半边而非最左边;
else return Query(Rson, pos);///在右半边而非最右边;
} int main()
{
int n, m, x;
char s[];
while(scanf("%d %d", &n, &m)!=EOF)
{
Build(, , n);
stack<int> sta;
for(int i=; i<=m; i++)
{
scanf("%s", s);
if(s[] == 'D')
{
scanf("%d", &x);
Update(, x, );
sta.push(x);///按破坏顺序一个一个的加入栈中
}
else if(s[] == 'Q')
{
scanf("%d", &x);
printf("%d\n", Query(, x));
}
else
{
x = sta.top();
sta.pop();
Update(, x, );
}
}
}
return ;
}
Tunnel Warfare--- hdu1540 线段树求连续子区间的更多相关文章
- HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU--1540 Tunnel Warfare(线段树区间更新)
题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...
- hdu1540 Tunnel Warfare【线段树】
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- poj 2892 Tunnel Warfare(线段树)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7499 Accepted: 3096 D ...
- hdu 1540 Tunnel Warfare (线段树 区间合并)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU - 1540 Tunnel Warfare(线段树区间合并)
https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...
随机推荐
- SharePoint如何模拟用户
try { SPSecurity.RunWithElevatedPrivileges(delegate() //用此方法模拟管理员账户运行此事件处理程序 { SPWeb web = SPContext ...
- Jsoup(三)-- Jsoup使用选择器语法查找DOM元素
1.Jsoup可以使用类似于CSS或jQuery的语法来查找和操作元素. 2.实例如下: public static void main(String[] args) throws Exception ...
- vsftpd下错误之:500 OOPS
vsftpd下错误之:500 OOPS.vsftpd 是在Linux发行版中最推崇的一种FTP服务器程序,vsftpd的特点:小巧轻快.安全易用等. Linux也是为人们所常用的操作系统之一.这里主要 ...
- CMake INSTALL 命令设置exe dll lib的安装位置
install(TARGETS ${OUT_NAME} RUNTIME DESTINATION ${CMAKE_BINARY_DIR}/bin LIBRARY DESTINATION ${CMAKE_ ...
- codeforces水题100道 第十八题 Codeforces Round #289 (Div. 2, ACM ICPC Rules) A. Maximum in Table (brute force)
题目链接:http://www.codeforces.com/problemset/problem/509/A题意:f[i][1]=f[1][i]=1,f[i][j]=f[i-1][j]+f[i][j ...
- sklearn提供的自带的数据集
sklearn 的数据集有好多个种 自带的小数据集(packaged dataset):sklearn.datasets.load_<name> 可在线下载的数据集(Downloaded ...
- read by other session 等待事件。
今天是2014-01-06,从今天开始,打算春节之前每天学习一个等待事件,今天就记录一下read by other session这个等待事件笔记. 什么是read by other session? ...
- Android 线程与主线程
网络连接需要时间.Web服务器可能需要1~2秒的时间来响应,文件下载则耗时更久.考虑到这个因素,Android禁止任何主线程网络连接行为.即使强行为之,Android也会抛出NetworkOnMain ...
- linux常用命令大全2--挂载/dpkg/文件系统分析/apt/光盘/关机
挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2 ...
- [Sdoi2016]平凡的骰子
描述 这是一枚平凡的骰子.它是一个均质凸多面体,表面有n个端点,有f个面,每一面是一个凸多边形,且任意两面不共面.将这枚骰子抛向空中,骰子落地的时候不会发生二次弹跳(这是一种非常理想的情况).你希望知 ...