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:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- Java的并发及锁
Java并发编程:用AQS写一把可重入锁 https://blog.csdn.net/zhang5476499/article/details/83796289 线程的同步时可以使一个线程阻塞而等待一 ...
- Lambda表达式介绍(转)
刚开始学lambda,lambda与linq的联合使用. Lambda表达式实际上是一个匿名函数.它包含表达式和语句,常用于创建委托或表达式目录树类型.所有Lambda表达式都是用Lambda运算符- ...
- PM2用法简介
简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单.引用 全局安装 sudo npm install pm2@lat ...
- 关于always块内for循环的执行方式
//该模块主要用来说明for结构在时序逻辑中的执行方式 :] eq_dly ); integer i; 'b1; always @(posedge clk_1 or negedge nrst) beg ...
- vue学习笔记总结----思维导图
- 通过设置线程池的最小线程数来提高task的效率,SetMinThreads。
http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
- Masonry练习详解
添加约束的方式: 1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConstraints = NO,即取 ...
- python_format格式化输出、while else、逻辑运算符、编码初识
1.格式化输出 .%d %s 格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...
- 第一部分之简单字符串SDS(第二章)
一,什么是SDS? 1.引出SDSC字符串:c语言中,用空字符结尾的字符数组表示字符串简单动态字符串(SDS):Redis中,用SDS来表示字符串.在Redis中,包含字符串值的键值对在底层都是由SD ...
- #Leetcode# 836. Rectangle Overlap
https://leetcode.com/problems/rectangle-overlap/ A rectangle is represented as a list [x1, y1, x2, y ...