Tunnel Warfare HDU - 1540(线段树最长连续区间)
题意:
#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(线段树最长连续区间)的更多相关文章
- I - Tunnel Warfare HDU - 1540 线段树最大连续区间
题意 :一段区间 操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路: 主要是push_up : 设区间x 为母区间 x<<1 ,x< ...
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
- E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并
E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...
- Tunnel Warfare HDU 1540 区间合并+最大最小值
Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...
- Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- Tunnel Warfare(hdu1540 线段树)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
- HDU - 1540 线段树的合并
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...
- hdu 1540 线段树
这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- 3.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——检查文件开始与结尾
检查文件两个互补的命令是head 和tail, 它们分别用于查看文件的开始(头部)和结束(尾部).head命令展示了文件的前10行.(Listing 11). ##Listing 11: 查看示例文件 ...
- [Oracle]OWI学习笔记--001
[Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...
- 更换pip源到国内镜像
1.pip国内的一些镜像 阿里云 https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/ ...
- BJOI2019 题解
BJOI2019 题解 在更了在更了 P5319 [BJOI2019]奥术神杖 对\(V_i\)求个\(\ln\)变成了让平均数最大,显然套分数规划,然后ac自动机上面dp #include<b ...
- 【JVM.11】Java内存模型与线程
鲁迅曾经说过“并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类‘压榨‘ 计算机运行能力的最有力武器.” 一.概述 多任务处理在现代计算机操作系统中几乎已 ...
- jenkins 构建后发送钉钉消息通知(插件)
钉钉,越来越多的公司采用,那么我们在持续集成中,也可以直接选择钉钉插件的,在之前的博客中 ,对发送的钉钉消息进行了定制,那样的话会开启一个新的任务, 其实今天呢,我们可以直接安装一个插件就可以发送了, ...
- Ionic 1 & 2 开发常见问题 Q&A
原文发表于我的技术博客 本文分享了在 Ionic 1 & 2 版本开发过程中常见问题的一些 Q&A,供慕课网同学或其他朋友参考. 原文发表于我的技术博客 1. 版本的问题 Ionic ...
- 图像数据增强 (Data Augmentation in Computer Vision)
1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟 ...
- Oracle数据库冷备份与热备份操作梳理
Oracle数据库的备份方式有冷备份和热备份两种,针对这两种备份的实施过程记录如下: 一.Oracle冷备份 概念数据库在关闭状态下完成所有物理系统文件拷贝的过程,也称脱机备份.适合于非归档模式(即n ...
- 磁盘挂载问题:Fdisk最大只能创建2T分区的盘,超过2T使用parted
需求说明:云服务器上买了一块8T的磁盘,准备挂载到服务器上的/data目录下. ===================================parted命令说明=============== ...