题目链接:传送门

参考文章:传送门

题意:n个数字初始连在一条线上,有三种操作,

D x表示x号被摧毁;

R 表示恢复剩下的通路

Q表示查询标号为x所在的串的最长长度。

思路:线段树的区间合并。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
struct Node{
int l,r;
int ls,rs,ms;
}cur[maxn<<];
int ss[maxn],m,n;
void build(int x,int l,int r) //初始化建树
{
cur[x].l=l;cur[x].r=r;
cur[x].ls=cur[x].rs=cur[x].ms=r-l+;
if(l==r) return ;
int mid=(l+r)>>;
build(x*,l,mid);
build(x*+,mid+,r);
}
int MAX(int x,int y)
{
return x>y?x:y;
}
void update(int x,int pos,int fg)
{
if(cur[x].l==cur[x].r)
{
if(fg==) cur[x].ls=cur[x].rs=cur[x].ms=; //删除
else cur[x].ls=cur[x].rs=cur[x].ms=; //更新
return ;
}
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid) update(x*,pos,fg);
else update(x*+,pos,fg);
//pushup操作,更新左子区间,右子区间的最长长度
cur[x].ls=cur[x*].ls;
cur[x].rs=cur[x*+].rs;
cur[x].ms=MAX(MAX(cur[x*].ms,cur[x*+].ms),cur[x*].rs+cur[x*+].ls);
if(cur[x*].ls==cur[x*].r-cur[x*].l+) cur[x].ls+=cur[x*+].ls; //如果区间的左子树的左区间已经满了,就加上右子树的左子区间
if(cur[x*+].rs==cur[x*+].r-cur[x*+].l+) cur[x].rs+=cur[x*].rs; // 如果右子树的右子区间已经满了,就加上左子树的右子区间
}
int query(int x,int pos)
{
if(cur[x].ms==||cur[x].l==cur[x].r||cur[x].ms==cur[x].r-cur[x].l+) return cur[x].ms;
int mid=(cur[x].l+cur[x].r)>>;
if(pos<=mid)
{
if(pos>=cur[x*].r-cur[x*].rs+) return query(x*,pos)+query(x*+,mid+);//如果在左子区间的右边界,就遍历两个区间
return query(x*,pos);
}
else
{
if(pos<=cur[x*+].l+cur[x*+].ls-) return query(x*+,pos)+query(x*,mid); //如果在右子区间的左边界,就遍历两个区间
return query(x*+,pos);
}
}
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
build(,,n);
char op[];
int x,top=;
while(m--)
{
scanf("%s",op);
if(op[]=='D')
{
scanf("%d",&x);
ss[top++]=x;
update(,x,);
}
else if(op[]=='Q')
{
scanf("%d",&x);
printf("%d\n",query(,x));
}
else if(op[]=='R')
{
x=ss[--top];
update(,x,);
}
}
}
return ;
}

hdu 1540(线段树区间合并)的更多相关文章

  1. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  2. HDU - 1540 线段树的合并

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

  3. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  5. hdu 1806(线段树区间合并)

    Frequent values Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. hdu 3308 线段树 区间合并+单点更新+区间查询

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  8. hdu 3911 Black And White (线段树 区间合并)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...

  9. HDU 3308 (线段树区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意: 两个操作  : 1 修改 单点  a 处的值. 2 求出 区间[a,b]内的最长上升子序列. 做法 ...

  10. HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举

    HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...

随机推荐

  1. 项目总结06:Java Excel文件导入功能HSSFWorkbook(xls)和 XSSFWorkbook (xlsx)

    项目中碰到Excel文件打入数据功能Mark一下 package com.blue.pem.client.util; import java.io.File; import java.io.FileI ...

  2. multithreading coding

    分类:公共资源问题.公交车问题 顺序:Qseater lab, bank, doctor [饭店] geust //yuec2 Yue Cheng package lab9; public abstr ...

  3. Js或 Activex 控件调用打印预览等操作

    <input value="打印" type="button" onclick="javascript:window.print()" ...

  4. MySQL安装(windows版本)

    1.下载.MySQL http://dev.mysql.com/downloads/mysql/ 下载windows的zip包,解压后,添加path路径bin, 系统环境变量->path-> ...

  5. Aspose.words四 bookmark

    通过添加bookmark书签来添加数据,首先通过方法MoverToBookmark移动指定的标签位置,然后添加数据,添加完成后清除掉bookmark标示. string templateFile = ...

  6. maven中导入包版本冲突的解决

    导入struts包,在struts核心包的ognl包下存在javassist包: 然后再导入hibernate包,在hibernate核心下也存在javassist包: 这样便会存在冲突,ecplis ...

  7. 9.10 h5日记

    9.10 1.什么是属性 属性是表示某些事物的一些特征 2.属性分为标签属性和样式属性,二者的区别在于哪里 标签属性:<img src="01.jpg" width=&quo ...

  8. Linux安装命令出现如下错误:cannot find a valid baseurl for repo :base/7x86_64

    今天刚回到家,在我的虚拟机上有安装了一个Linux系统,安装好之后,想要安装如下命令,yum install wget,yum install gcc,yum install vim,发现一个也没有安 ...

  9. 11.Mysql视图

    11.视图11.1 什么是视图 视图view是一张虚拟表,它不存储数据,数据仍在表里,视图由一条查询表的select语句创建,视图只存储select语句. 可以将复杂的查询语句封装成视图,用户可以从视 ...

  10. CSS学习总结3:CSS定位

    CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动和绝对定位. 一.普通流 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由元素在(X)HTML中的位置决定.块级元素从上到下 ...