HDU1540

线段树最大连续区间。

给定长度为n的数组,m次操作。

操作D,删除给定节点。

操作R,恢复最后一个删除的节点。

操作Q,询问给定节点的最大连续区间

维护三个值,区间的最大左连续区间,最大右连续区间,最大连续区间

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
using namespace std;
typedef long long ll;
const int maxn = 50000 + 5; #define lson l,m,st<<1
#define rson m+1,r,st<<1|1 int treelmax[maxn<<2];
int treermax[maxn<<2];
int len[maxn<<2]; void build(int l,int r,int st)
{
len[st]=r-l+1;
if(l==r)
{
treelmax[st]=1;treermax[st]=1;
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
treelmax[st]=len[st]; //初始化的值全为区间长度
treermax[st]=len[st];
} void UpdataDes(int x,int l,int r,int st) //破坏
{
if(l==x&&r==x)
{
treelmax[st]=0; treermax[st]=0;len[st]=0; return;
}
int m=(l+r)>>1;
if(x<=m) UpdataDes(x,lson);
else UpdataDes(x,rson); //if(x>m)
treelmax[st]=treelmax[st<<1]==(m-l+1)?treelmax[st<<1]+treelmax[st<<1|1]:treelmax[st<<1]; //判断左儿子的最大左连续区间是否等于左儿子区间长度,如果等于,那么父亲的最大左连续区间就等于左儿子的区间长度加上右儿子右最大左区间连续长度
treermax[st]=treermax[st<<1|1]==(r-m)?treermax[st<<1|1]+treermax[st<<1]:treermax[st<<1|1];
len[st]=max(max(treelmax[st<<1],treermax[st<<1|1]),treermax[st<<1]+treelmax[st<<1|1]);
//父节点的最大连续长度等于 左儿子最大左连续区间 右儿子最大右连续区间 左儿子最大右连续区间加上右儿子最大左连续区间 中的最大值
} void UpdataRec(int x,int l,int r,int st) //修复
{
if(l==x&&r==x)
{
treelmax[st]=1; treermax[st]=1;len[st]=1; return ;
}
int m=(l+r)>>1;
if(x<=m) UpdataRec(x,lson);
else UpdataRec(x,rson); //if(x>m)
treelmax[st]=treelmax[st<<1]==(m-l+1)?treelmax[st<<1]+treelmax[st<<1|1]:treelmax[st<<1];
treermax[st]=treermax[st<<1|1]==(r-m)?treermax[st<<1|1]+treermax[st<<1]:treermax[st<<1|1];
len[st]=max(max(treelmax[st<<1],treermax[st<<1|1]),treermax[st<<1]+treelmax[st<<1|1]);
//pushup;
} int query(int x,int l,int r,int st)
{
if(l==r||len[st]==0||len[st]==r-l+1)
return len[st];
int m=(l+r)>>1;
if(x<=m) //x在左儿子区间内
{
if(x>=m-treermax[st<<1]+1) //x在左儿子的右连续区间内
return treermax[st<<1]+treelmax[st<<1|1]; //左儿子右连续
//return len[st<<1];
else //x在左儿子的左连续区间内
return query(x,lson);
}
else //x在右儿子区间内
{
if(x<m+1+treelmax[st<<1|1]) //x在右儿子的左连续区间
return treermax[st<<1]+treelmax[st<<1|1]; //左儿子的右连续加上右儿子的左连续
//return len[st<<1|1];
else //x在右儿子的右连续区间
return query(x,rson);
}
} int main()
{
int n,m;
char ope[5];
int x;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,n,1);
stack<int> destroy;
while(m--)
{
scanf("%s",ope);
if(ope[0]=='D')
{
scanf("%d",&x);
UpdataDes(x,1,n,1);
destroy.push(x);
}
else if(ope[0]=='R')
{
if(destroy.empty()) continue;
x=destroy.top();
UpdataRec(x,1,n,1);
destroy.pop();
}
else
{
scanf("%d",&x);
printf("%d\n",query(x,1,n,1));
}
}
}
return 0;
}

最大连续区间(HDU-1540)的更多相关文章

  1. HDU 1540 Tunnel Warfare(最长连续区间 基础)

    校赛,还有什么途径可以申请加入ACM校队?  Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/ ...

  2. HDU 1540 Tunnel Warfare

    HDU 1540 思路1: 树状数组+二分 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #d ...

  3. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  4. HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)

    题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...

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

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

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

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

  7. I - Tunnel Warfare HDU - 1540 线段树最大连续区间

    题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x< ...

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

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

  9. hdu 1540 Tunnel Warfare (线段树,维护当前最大连续区间)

    Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively i ...

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

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

随机推荐

  1. kubernetes资源均衡器Descheduler

    背景 Kubernetes中的调度是将待处理的pod绑定到节点的过程,由Kubernetes的一个名为kube-scheduler的组件执行.调度程序的决定,无论是否可以或不能调度容器,都由其可配置策 ...

  2. IOT设备SmartConfig实现

    一般情况下,IOT设备(针对wifi设备)在智能化过程中需要连接到家庭路由.但在此之前,需要将wifi信息(通常是ssid和password,即名字和密码)发给设备,这一步骤被称为配网.移动设备如An ...

  3. js语法基础入门(6)

    6.函数 6.1.函数是什么? 函数就是具有名称和一定功能点代码块,这段代码块被封装起来,由一组语句组成,它们是JavaScript的基础模块单元,用于代码复用.信息隐藏和组合调用.一般来说,所谓编程 ...

  4. MFC文档视图中窗口切换 (2012-05-11 18:32:48)

    在文档试图应用程序,有时需要在工作区切换试图,以下就是如何切换试图了 .创建要切换的视图类,同时把构造函数,Create函数改变为public .在需要切换试图的动作响应中,加入切换代码,一般是在CM ...

  5. Idea+springboot入坑之路

    环境准备 IDEA 社区版: 2019.3 jdk: 1.8.0_241 tomcat: 7.0.99 maven: 3.6.3 spring-boot:2.2.5.RELEASE 插件 spring ...

  6. 看完这篇Redis缓存三大问题,保你面试能造火箭,工作能拧螺丝。

    前言 日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题. 一旦涉及大数据量的需求,如一些商品抢购的情景,或者主页访问量瞬间较 ...

  7. Centos7-Docker1.12开启守护进程(远程调用)

    本文讲述了Docker1.12.6在Linux下开启守护进程(远程调用),理论上来说其他版本也是一样的改法,博主参考很多都是巨坑,综合自己实战分享给大家,如有错误请留言; - 修改配置 1.修改 do ...

  8. 使用Fiddler模拟Post请求

    做了一个动态的GIF来做演示,应该更加直观些. (完)

  9. Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available

    连接elasticsearch已经成功,但是会报以下错误,字面意思是节点不可用这样 Exception in thread "main" NoNodeAvailableExcept ...

  10. Oracle收集对表收集统计信息导致全表扫描直接路径读?

    direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...