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:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- CF1028G Guess the Numbers 构造、记忆化搜索
传送门 考虑如果我们当前可以询问\(x\)个数,还剩下\(q\)次询问机会,我们要怎么构造询问方式? 肯定会这么考虑: 找到一个尽可能大的\(P\)满足\([x,P]\)能在每一次能询问\(x\)个数 ...
- PowerDesign 16.0 生成的SQL Server2000 数据库脚本时MS_Description不存在的问题解决
根据网上查询到的资料,找到了解决方法,原文出自:http://www.cnblogs.com/24tt/p/5047257.html PowerDesign 16.0 生成的Script语句,Sql2 ...
- WebApi 异步请求(HttpClient)
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 今天公司总部要求各个分公司把短信接口对接上,所谓的 ...
- 商场促销-策略模式(和简单工厂模式很像的哇) C#
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 首先按照大话设计模式的解释,在这里也总结下策略模式 ...
- python实现微信自动回复机器人
一 简单介绍 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计等功能. 总而言之,可用 ...
- .Net core使用EF Core Migration做数据库升级
---恢复内容开始--- (1)VS Code下创建含有授权功能的并且使用localdb作为数据库的命令 dotnet new -au individual -uld --name identityS ...
- Log4net_简单使用
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局). 第一步:Log4net的安装 Install-P ...
- HDU-6440-费马小定理
亏我前几天还学数论呢...没有深入研究费马小定理这个东西...做事情一定要静下心来啊... 题目要求满足(m+n)^p=m^p+n^p,要你定义一个封闭的新的加法和乘法运算 我们知道费马小定理中有两种 ...
- “Linux内核分析”实验报告
Linux内核分析:实验一 潘俊洋 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...