题意:

一条线上的点,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. java 变量及数据类型、原码、反码、补码

    Java基础——变量及数据类型 变量的概念 内存中的一个存储区域 变量名+数据类型 可在同一类型范围内不断变化 为什么定义变量: 用于不断的存放同一类型的常量,并可以重复使用 使用变量注意: 变量的作 ...

  2. CF418D Big Problems for Organizers 树的直径、ST表

    题目传送门:http://codeforces.com/problemset/problem/418/D 大意:给出一棵有$N$个节点的树,所有树边边权为$1$,给出$M$次询问,每个询问给出$x,y ...

  3. git log 的常用选项

  4. [JSOI2016]轻重路径[树链剖分]

    题意 题目链接 分析 先对原树树剖,在一次删点操作后从根节点开始二分,如果一条边从重边变成轻边,必然有 \(size_u\le \frac{1}{2}size_{rt}\) (取等号是特判对应儿子消失 ...

  5. Asp.Net_ 服务端向客户端写JavaScript脚本

    在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArrayDe ...

  6. 时间复杂度O(n^2)和O(nlog n)差距有多大?

    0. 时间复杂度 接触到算法的小伙伴们都会知道时间复杂度(Time Complexity)的概念,这里先放出(渐进)时间复杂度的定义: 假设问题规模是\(n\),算法中基本操作重复执行的次数是\(n\ ...

  7. 系统、决策、控制研究系列(SSDC)

    本类目主要介绍的书籍来自springer的系列书籍中的一本,对于该系列书籍介绍如下: “系统.决策及控制研究”(SSDC)系列涵盖了在广泛认知的系统.决策及控制的各个领域的快速.最新和高质量的最新发展 ...

  8. Git分支管理的策略梳理

    当下最流行的版本管理系统应该是非Git莫属.相比同类软件,Git有很多优点,其中很显著的一点,就是版本的分支(branch)和合并(merge)十分方便.有些传统的版本管理软件,分支操作实际上会生成一 ...

  9. 11.18 Daily Scrum

    这两天开发人员陆续提交了自己开发的部分. 目前所有开发任务都已经完成,剩下的只是测试和整合,做最后的冲刺. 明天的任务: 李承晗:测试与整合

  10. <构建之法>10,11,12章的读后感

    第十章:典型用户和场景 问题 :什么是典型用户? 第十一章:软件设计与实现 问题 :开发人员的标准工作流程就是不断的发现BUg,修改bug来完善功能,在此过程中要等待同伴复审,在这阶段中,开发者应该如 ...