题目链接

题意:有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 线段树求连续子区间的更多相关文章

  1. HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. HDU--1540 Tunnel Warfare(线段树区间更新)

    题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...

  3. hdu1540 Tunnel Warfare【线段树】

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  4. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  5. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

  6. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  7. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

  8. hdu 1540 Tunnel Warfare (线段树 区间合并)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. HDU - 1540 Tunnel Warfare(线段树区间合并)

    https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...

随机推荐

  1. Apache Kafka 1.0.0正式发布!

    千呼万唤始出来,经过7年的发展与完善,Apache Kafka 1.0.0正式发布!在笔者看来,比起1.0.0引入的新功能,此版本最大的意义在于标识Kafka各种组件功能的稳定性.不过我们还是来看下1 ...

  2. N76E003系统时钟

    系统时钟源N76E003共有3种系统时钟源,包括: 内部高速/低速振荡器.外部输入时钟.它们每一个都可以作为N76E003的系统时钟源.开启不同的时钟源可能会影响到多功能引脚P3.0/XIN .内部振 ...

  3. jQuery ajax中serialize()方法增加其他参数

    表单提交 使用jQuery.ajax()进行表单提交时,需要传递参数,最直接的方法便是使用Form的serializa()将表单序列化,前提只是将Form表单中的name属性与数据库的字段名保持一致便 ...

  4. C++ template —— 表达式模板(十)

    表达式模板解决的问题是:对于一个数值数组类,它需要为基于整个数组对象的数值操作提供支持,如对数组求和或放大: Array<), y(); ... x = 1.2 * x + x * y; 对效率 ...

  5. Android Studio 出现 Gradle's dependency cache may be corrupt 解决方案

    将 .\项目地址\gradle\wrapper\gradle-wrapper.properties 文件中的 gradle版本 与 正常的版本 修改一致即可.

  6. sqlserver添加查询 表、字段注释(转)

    环境:xp sp3,sql server2008 .sqlserver用语句给表注释 EXECUTE sp_addextendedproperty N'MS_Description', N'表注释', ...

  7. WEB服务器控件对应生成的HTML标签 及最常应用事例

    首先得了解WEB服务器控件对应生成的HTML标签 label----------<span/>button---------<input type="submit" ...

  8. maven中properties标签定义变量

    在pom.xml中添加依赖时语法如下 <dependency> <groupId>org.springframework</groupId> <artifac ...

  9. 【NOI2015】荷马史诗[Huffman树+贪心]

    #130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读 ...

  10. 上传控件---淘宝kissy uploader+瀑布流显示

    介绍Uploader : Uploader 是由阿里集团前端工程师们发起创建的一个开源 JS 框架.它具备模块化.高扩展性.组件齐全,接口一致.自主开发.适合多种应用场景等特性. Uploader是非 ...