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. JS代码简洁之道--函数

    函数的参数越少越好 有一个准则是:如果你的函数参数超过两个,就应该改为对象传入. 这样做是合理的,因为当函数参数超过两个时,参数顺序开始变得难以记忆,而且容易出现一种很尴尬的情况:比如我只需要传入第三 ...

  2. Typography convention

    1 h1 Chapter title centered,number three in bold,used ##. 1.1 h2 The chapter is a section, and the s ...

  3. js/ts/tsx读取excel表格中的日期格式转换

    const formatDate = (timestamp: number) => { const time = new Date((timestamp - 1) * 24 * 3600000 ...

  4. css3 自定义字体_使用@font-face方式实现个性化字体

    当我们在浏览一些网站时发现,里面含有一些十分个性的字体,这些字体并不是我们电脑上安装的字体.那么css是如何实现自定义字体的呢? 资源网站大全https://55wd.com 在css3中可以通过@f ...

  5. 不用加减乘除做加法(剑指offer-48)

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目解析 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计 ...

  6. Django---进阶15

    目录 文章详情页 文章点赞点踩 文章评论 文章详情页 # url设计 /username/article/1 # 先验证url是否会被其他url顶替 # 文章详情页和个人站点基本一致 所以用模版继承 ...

  7. SimpleImputer 中fit和transform方法的简介

    sklearn.impute.SimpleImputer 中fit和transform方法的简介 SimpleImputer 简介 通过SimpleImputer ,可以将现实数据中缺失的值通过同一列 ...

  8. response对象乱码--解决

    中文乱码 响应对象中文乱码,即就是response对象乱码. response对象输出中文数据乱码解决方案: 1 字节流输出响应乱码. 该情况不一定乱码.但是解决乱码的步骤是: 1) 设置浏览器打开文 ...

  9. Typora上传图片设置

    Typora上传图片设置 问题 使用Typora写文档时上传图片的路径默认是本地磁盘的路径,这样就导致一个问题,当写好的文档上传到blog.csdn等博客网站时,会导致图片失效无法识别的问题. 解决方 ...

  10. Bootstrap 搭建基础页面

    基于Bootstrap实现下图所示效果的页面,一个居中的标题和一个大按钮: <!DOCTYPE html> <html lang="zh-cn"> < ...