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:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- OSGeo.OGR.Geometry
#region 程序集 ogr_csharp.dll, v2.0.50727 // D:\KM行业需求\C++\gdal17_cSharp\ogr_csharp.dll #endregion usin ...
- 串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解 2012年11月13日 09:35:45 他山之石可以攻玉 阅读数:37952更多 个人分类: 控件编程Delphi编程 MSComm 控件通过串行端口传输和接 ...
- vba总结用法 及案例图
- Luogu4899 IOI2018 Werewolf 主席树、Kruskal重构树
传送门 IOI强行交互可还行,我Luogu的代码要改很多才能交到UOJ去-- 发现问题是对边权做限制的连通块类问题,考虑\(Kruskal\)重构树进行解决. 对于图上的边\((u,v)(u<v ...
- [Oracle]快速构造大量数据的方法
[Oracle]快速构造大量数据的方法: create table tab001(id integer primary key, val varchar2(100)); insert into tab ...
- Jlink使用技巧之虚拟串口功能
前言 串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink ...
- .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
前言 读本篇文章之前,可以先读前两篇文章.为了照顾没看过的朋友,我也会稍作复习. 思考大纲: .Net架构篇:思考如何设计一款实用的分布式监控系统? 实践篇一:.NetCore实践篇:分布式监控客户端 ...
- Express4.x API (三):Response (译)
Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...
- MySQL主主同步配置
1. MySQL主主配置过程 在上一篇实现了主从同步的基础上,进行主主同步的配置. 这里用node19(主),node20(从)做修改,使得node19和node20变为主主同步配置模式 修改配置文件 ...
- nginx的access.log文件详解
事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...