I - Tunnel Warfare HDU - 1540 线段树最大连续区间
题意 :一段区间 操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间
思路: 主要是push_up : 设区间x 为母区间 x<<1 ,x<<1|1分别为两个子区间
x的左端连续子段和 :当x<<1区间没有断开 也就是 x<<1 的最大连续子段ml ==tree[x<<1].r-tree[x<<1].l+1 等于区间长度时 x左端连续字段和tree[x].ll=tree[x<<1].ll+tree[x<<1|1].ll如果断开了直接就等于左子区间
最大子段和
x的右端连续子区间同理
x的最大连续子区间 x的最大连续子区间只可能在 1. 以x的Mid为分界 左子区最大连续和 2.右子区最大连续和 3.横跨mid 前两个分别直接区子区间的就能 第三个长度等于tree[x<<1].rl+tree[x<<1|1].ll 取三个里面最大即可
查询: 如果查询的点t 当前所查询的区间tree[x].ml最大连续子段和直接等于0 或者 tree[x].l==tree[x].r时 或者 区间是完整的 也就是tree[x].ml=tree[x].r-tree[x].l+1 时都可以直接返回
不然 令mid=l+r>>1 如果要查询的点t 在mid左边(包括Mid)那么当t 位于区间tree[x<<1]的从右开始的最长连续区间时 还可以把与其相邻的子区间tree[x<<1|1].ll接上 如果不位于 直接往下面查即可
如果要查询的点t 在mid右边(不包括Mid)同理
记得循环输入
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct Node{
int l,r;
long long ll,rl,ml;
}tree[maxn*];
void build(int x,int l,int r){
tree[x].l=l,tree[x].r=r;
tree[x].ll=tree[x].rl=tree[x].ml=r-l+;
if(l==r)return ;
else {
int mid=l+r>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
}
void push_up(int x){
tree[x].ll=tree[x<<].ll;
tree[x].rl=tree[x<<|].rl;
tree[x].ml=max(tree[x<<].ml,tree[x<<|].ml);
tree[x].ml=max(tree[x].ml,tree[x<<].rl+tree[x<<|].ll);
if(tree[x<<].ll==tree[x<<].r-tree[x<<].l+)tree[x].ll+=tree[x<<|].ll;
if(tree[x<<|].rl==tree[x<<|].r-tree[x<<|].l+)tree[x].rl+=tree[x<<].rl;
}
void update(int x,int t,int val){
if(tree[x].l==tree[x].r){
if(val==)tree[x].ll=tree[x].rl=tree[x].ml=;
else tree[x].ll=tree[x].rl=tree[x].ml=;
return ;
}
else {
int mid=tree[x].l+tree[x].r>>;
if(t<=mid)update(x<<,t,val);
else update(x<<|,t,val);
push_up(x);
}
}
long long query(int x,int t){
if(tree[x].l==tree[x].r||tree[x].ml==||tree[x].ml==tree[x].r-tree[x].l+){
return tree[x].ml;
}
else {
int mid=tree[x].l+tree[x].r>>;
if(t<=mid){
if(t>=tree[x<<].r-tree[x<<].rl+){
return query(x<<,t)+query(x<<|,mid+);
}
else return query(x<<,t);
}
else {
if(t<=tree[x<<|].l+tree[x<<|].ll-){
return query(x<<|,t)+query(x<<,mid);
}
else return query(x<<|,t);
}
} }
int Q[maxn];
int main(){
int n,q;
while(scanf("%d%d",&n,&q)==){
build(,,n);
int t=;
//int last=0;
int top=;
for(int i=;i<=q;i++){
char s[];
scanf("%s",s);
if(s[]=='D'){
scanf("%d",&t);
Q[top++]=t;
update(,t,);
}
if(s[]=='Q'){
scanf("%d",&t);
printf("%lld\n",query(,t));
}
if(s[]=='R'){
update(,Q[--top],);
}
}
}
return ;
}
I - Tunnel Warfare HDU - 1540 线段树最大连续区间的更多相关文章
- 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 HDU - 1540(线段树最长连续区间)
题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 解析: 线段树结点 设置一个 lq记录区间左端点开始的最大连续个数, rq ...
- 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:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- POST BOY : Restful API 调试工具
在使用asp.net webapi开发中,一般情况下会使用一些工具来模拟请求. 其中有一款chrome浏览器插件POST MAN比较不错. 但是由于国内google服务使用不稳定,所以我自己写了一个简 ...
- .net Core 调用微信Jsapi接口,H5解析二维码
项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...
- NFV论文集(三)综述
一 文章名称:Dependability of the NFV Orchestrator: State of the Art and Research Challenges 发表时间:2018 期刊来 ...
- PEP 8 python编程规范
一 代码编排 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格. 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车. 类和to ...
- NET操作RabbitMQ组件EasyNetQ
NET操作RabbitMQ组件EasyNetQ使用中文简版文档. 本文出自EasyNetQ官方文档,内容为自己理解加翻译.文档地址:https://github.com/EasyNetQ/EasyNe ...
- stark组件之delete按钮、filter过滤
1.构建批量删除按钮 2.filter过滤 3.总结+coding代码 1.构建批量删除按钮 1.admin中每个页面默认都有 2.stark之构建批量删除 3.coding {% extends ' ...
- jmeter 启动jmeter-server.bat远程调用报错: java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
1.找到apache-jmeter-5.0\bin\jmeter.properties 2.修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl.disa ...
- spring遇到的Error applying BeanValidation relational constraints
spring3.1+hibernate4集成测试时遇到的问题: log4j:WARN No appenders could be found for logger (org.springframewo ...
- 《Effective C++》让自己习惯C++:条款1-条款4
条款1:视C++为一个语言联邦 可以将C++分为4个层次: 1.C:C++实在C语言的基础上发展而来的. 2:Object-Oriented C++:C++面向对象. 3:Template C++:C ...
- 解决.Net Mvc跨域请求问题
针对ASP.NET MVC和ASP.NET Web API两种项目类型 1.针对ASP.NET MVC,只需要在web.config中添加如下的内容即可 <system.webServer> ...