题意  :一段区间  操作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 线段树最大连续区间的更多相关文章

  1. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  2. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  3. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  4. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  5. Tunnel Warfare HDU - 1540(线段树最长连续区间)

    题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点.   解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq ...

  6. Tunnel Warfare(hdu1540 线段树)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  8. HDU - 1540 线段树的合并

    这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...

  9. hdu 1540 线段树

    这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...

随机推荐

  1. [C#] LINQ之Join与GroupJoin

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.编写Person与City类,如下: class Person { public int CityID { set; get; } ...

  2. koa服务器搭建基础

    之前我一直使用rails搭建网站.rails与koa的基本理念很相似,都是基于中间件提供一层层的服务.所不同的是,rails有很多内置的中间件,这使得开发者只需要关注MVC模块以及页面路由.而Koa这 ...

  3. Elasticsearch 关键字:索引,类型,字段,索引状态,mapping,文档

    1. 索引(_index)索引:说的就是数据库的名字.我这个说法是对应到咱经常使用的数据库. 结合es的插件 head 来看. 可以看到,我这个地方,就有这么几个索引,索引就是数据库,后面是这个数据库 ...

  4. vue双向数据绑定的简单实现

    vue双向数据绑定的简单实现 参考教程:链接 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  5. react单组件 渲染页面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. CART算法与剪枝原理

    参考:https://blog.csdn.net/u014688145/article/details/53326910 知乎:https://www.zhihu.com/question/22697 ...

  7. java.util.concurrent.TimeoutException: Idle timeout expired: 300000/300000 ms

    Request idle timed out at 123000 ms. That means there was no activity (read or write) for 123000 ms ...

  8. 996.ICU

    996.ICU https://github.com/996icu/996.ICU https://www.zhihu.com/question/317722302 LICENSE https://g ...

  9. mybatis generator的maven插件,找不到properties的配置文件错误的解决

    第一次运行的时候,maven插件是正确运行了的 但后面对 maven 的 build节点做了一点修改,就开始报错,找不到 properties标签指定的的数据库连接配置文件了 修改部分如下: 这个操作 ...

  10. pip 安装 MySQL-python 报错

    报错一:EnvironmentError: mysql_config not found 解决:yum install mysql-devel 报错二:Python.h No such file or ...