题意:

一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。
 
解析:
线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq 记录区间右端点开始的最大的连续个数
其它和原来一样即可
看代码吧。。。
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff;
typedef long long LL;
int a, b, x, y, ans; struct node{
int l, r, w, lq, rq;
}Node[maxn]; void build(int k, int ll, int rr)
{
Node[k].l = ll, Node[k].r = rr;
if(Node[k].l == Node[k].r)
{
Node[k].lq = Node[k].rq = Node[k].w = ;
return;
}
int m = (ll + rr) / ;
build(k*, ll, m);
build(k*+, m+, rr);
Node[k].lq = Node[k].rq = Node[k].w = Node[k*].w + Node[k*+].w;
} void chp(int k) //单点修改
{
if(Node[k].l == Node[k].r)
{
Node[k].lq = Node[k].rq = Node[k].w = y;
return;
}
int m = (Node[k].l + Node[k].r) / ;
if(x <= m) chp(k*);
else chp(k*+);
Node[k].w = Node[k*].w + Node[k*+].w;
Node[k].lq = Node[k*].lq; //修改后初始化 父结点的最长连续左区间 为 左子结点的最长连续左区间
Node[k].rq = Node[k*+].rq; //父结点的最长连续右区间 为 右子结点的最长连续右区间
if(Node[k*].lq == Node[k*].r - Node[k*].l + ) //如果左子结点的最长连续左区间 为整个区间的长度 那么父结点的最长连续左区间 应该 加上 右子结点的最长连续右区间
Node[k].lq += Node[k*+].lq;
if(Node[k*+].rq == Node[k*+].r - Node[k*+].l + ) // 同理
Node[k].rq += Node[k*].rq;
} void qinter(int k, int t)
{
if(Node[k].l == Node[k].r || Node[k].w == || Node[k].w == Node[k].r - Node[k].l + ) //如果当前区间为单点、区间和为0、区间和为区间长度 那么就没必要往下搜了 返回即可
{
ans += Node[k].w;
return;
}
int m = (Node[k].l + Node[k].r) / ;
if(t <= m) //如果t在左子树
{
if(t >= Node[k*].r - Node[k*].rq + ) //如果t大于左子树右区间的左端点 说明t在左子树的右区间内
{
ans += (Node[k*].rq + Node[k*+].lq); //然后用左子树的最长连右区间 + 右子树的最长连续左区间
return;
}
else
qinter(k*, t); //如果不在右区间 则向下搜
}
else //同理
{
if(t <= Node[k*+].l + Node[k*+].lq - )
{
ans += (Node[k*+].lq + Node[k*].rq);
return;
}
else
qinter(k*+, t);
}
} int main()
{
int n, m;
ans = ;
while(~scanf("%d%d",&n,&m)){
build(, , n);
stack<int> G;
getchar();
for(int i=; i<m; i++)
{
char str[];
scanf("%s",str);
if(strcmp(str, "D") == )
{
scanf("%d",&x);
G.push(x);
y = ;
chp();
}
else if(strcmp(str, "R") == )
{
x = G.top();
G.pop();
y = ;
chp();
}
else if(strcmp(str, "Q") == )
{
scanf("%d",&x);
ans = ;
qinter(, x);
printf("%d\n",ans);
} }
}
return ;
}

Tunnel Warfare HDU - 1540(线段树最长连续区间)的更多相关文章

  1. I - Tunnel Warfare HDU - 1540 线段树最大连续区间

    题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x< ...

  2. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  3. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  4. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  5. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

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

  6. Tunnel Warfare(hdu1540 线段树)

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

  7. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  8. HDU - 1540 线段树的合并

    这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...

  9. hdu 1540 线段树

    这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...

随机推荐

  1. Redis对象占用内存分析

    当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...

  2. [Spark][Hive]外部文件导入到Hive的例子

    外部文件导入到Hive的例子: [training@localhost ~]$ cd ~[training@localhost ~]$ pwd/home/training[training@local ...

  3. Postgres使用ALTER USER命令修改用户的密码、密码过期,锁定,解锁

    使用ALTER USER命令修改用户的密码.密码过期,锁定,解锁 (1)修改用户的口令,将用户的口令修改为新的密码 highgo=#create user test with password ‘te ...

  4. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  5. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  6. 手机H5移动端WEB资源整合之meta标签

    一.相关网站使用meta的实例 youku首页的Meta设置: <meta charset="utf-8"> <meta http-equiv="X-U ...

  7. Http指南(3)

    Web主机托管 主机托管服务 虚拟主机托管:许多Web托管者通过让一些顾客共享一台计算机来提供便宜的Web主机托管服务.这称为共享主机托管或虚拟主机托管 虚拟服务器请求缺乏主机信息: 不幸的是,HTT ...

  8. 基于 HTML5 Canvas 的 3D WebGL 机房创建

    对于 3D 机房来说,监控已经不是什么难事,不同的人有不同的做法,今天试着用 HT 写了一个基于 HTML5 的机房,发现果然 HT 简单好用.本例是将灯光.雾化以及 eye 的最大最小距离等等功能在 ...

  9. doc窗口 输入命令net start mysql 服务名无效

    解决方案: 1.win+R键输入cmd敲回车进入dos界面: 2.输入cd d:/mysql-5.5.25/bin敲回车,发现没变化: 3.输入d:敲回车,定位到d:\mysql-5.5.25\bin ...

  10. 12.14 Daily Scrum

      Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             邓亚梅             美化搜索框UI. 美 ...