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:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- 图解SSH原理及两种登录方法
SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密. 传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这 ...
- Linux—CentOS7下python开发环境配置
CentOS7下python开发环境配置 上一篇博客讲了如何在Centos7下安装python3(https://www.cnblogs.com/zivli/p/9937608.html),这一次配置 ...
- codeforces#1097 D. Makoto and a Blackboard(dp+期望)
题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...
- iOS QRcode识别及相册图片二维码读取识别
https://www.jianshu.com/p/48e44fe67c1d 2016.03.30 10:32* 字数 892 阅读 16197评论 5喜欢 34赞赏 1 最近碰到一个用户 在使用我们 ...
- p76泛函 有限维空间真子空间不可能在全空间稠密
连续函数 然后多项式函数是稠密的 多项式子空间是无穷维的 多项式空间就是在全体连续函数的线性空间中稠密 有限维子空间是闭的 多项式空间也不是有限维 2的地方说 有限维真子空间必不稠密 那是对的啊 有 ...
- 软件工程(FZU2015) 赛季得分榜,第七回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- 开发神器之phpstorm破解与日常使用
PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. PhpStorm可随时帮助用 ...
- Java中有关Null的9件事(转)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比
迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比 Intel 最强CPU 从最开始的双核 到现在的 28核 发展迅猛. https://www.cnbeta.com/article ...
- hive权限配置
基于CDH5.x的Hive权限配置 1.打开权限控制,默认是没有限制的 set hive.security.authorization.enabled=true; 2.配置默认权限 hive.secu ...