题目连接

参考

题意:

维护各个点的连续的最大连续长度。

思路:

主要是维护一个区间的三个变量ll,f[i].l为起点向右的最大连续
长度,rl:f[i].r为起点向左的最大连续长度,ml:[l,r]区间内的
最大连续长度,便于合并。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+100;
struct node
{
int l,r;
int ll,rl,ml;
};
int a[maxn];
int sti[maxn];//sickc,数组的话更快,也更方便
int top=0;
node f[maxn*4];
void maketree(int i,int l,int r)
{
f[i].l=l;
f[i].r=r;
f[i].ll=f[i].rl=f[i].ml=r-l+1;//刚开始都连续
if(l==r)
return ;
int mid=(l+r)>>1;
maketree(i<<1, l, mid);
maketree(i<<1|1, mid+1, r);
}
void update(int i,int x,int v)
{
if(f[i].l==f[i].r)//叶子结点
{
f[i].ll=f[i].rl=f[i].ml=v;//v=0||1;
return ;
}
int mid=(f[i].l+f[i].r)>>1;
if(x<=mid) update(i<<1, x, v);
else update(i<<1|1, x, v);
//合并操作:!
//ml
f[i].ml=max(f[i<<1].ml,f[i<<1|1].ml);
f[i].ml=max(f[i].ml,f[i<<1].rl+f[i<<1|1].ll);
//ll
f[i].ll=f[i<<1].ll;
if(f[i].ll==f[i<<1].r-f[i<<1].l+1)
f[i].ll+=f[i<<1|1].ll;
//rl
f[i].rl=f[i<<1|1].rl;
if(f[i].rl==f[i<<1|1].r-f[i<<1|1].l+1)
f[i].rl+=f[i<<1].rl;
}
int query(int i,int x)//寻找连续区间的最大值
{
if(f[i].l==f[i].r||f[i].ml==f[i].r-f[i].l+1||f[i].ml==0)
//是叶子节点||都连续||都不连续直接返回ml
return f[i].ml;
int mid=(f[i].l+f[i].r)>>1;
if(x<=mid){
if(x>=mid-f[i<<1].rl+1)//主要看代码
return query(i<<1, x)+query(i<<1|1, mid+1);
else
return query(i<<1, x);
}
else {
if(x<=mid+f[i<<1|1].ll)
return query(i<<1, mid)+query(i<<1|1, x);
else
return query(i<<1|1, x);
}
}
int main ()
{
int n,m;
char s[5];
while(~scanf("%d%d",&n,&m))//WA一次
{
top=0;
maketree(1, 1, n);
for(int i=1;i<=m;i++)
{
scanf("%s",s);
if(s[0]!='R'){
int t;
scanf("%d",&t);
if(s[0]=='D'){
sti[++top]=t;
update(1, t, 0);
}
else if(s[0]=='Q')
printf("%d\n",query(1, t));
}
else
update(1, sti[top--], 1);
}
}
return 0;
}

HDU 1540<线段树,区间并>的更多相关文章

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

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

  2. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

  3. HDU - 1540 线段树的合并

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

  4. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  5. hdu 1698 线段树 区间更新 区间求和

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

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

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

  7. HDU 3911 线段树区间合并

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

  8. HDU - 1698 线段树区间修改,区间查询

    这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...

  9. HDU 5023线段树区间染色,统计区间内颜色个数

    这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...

  10. hdu 1540 线段树

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

随机推荐

  1. 3种日志类型,微信付款反馈-->写入txt日志

    --> 接收  $GLOBALS["HTTP_RAW_POST_DATA"] ---->xml 反系列化$qr = XML_unserialize( $rowpost ...

  2. jquery之全选全不选

    <input type="checkbox" onclick="selall(this)" />全选/全不选 <input type=&quo ...

  3. 不完善的css怦然心动,有待改进...

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. python 进制 转换

    测试用的python源码 ''''' Created on 2014年8月21日 @author: lenovo ''' import binascii import struct def examp ...

  5. robotium和appium的一些区别

    Appium是基于UIAutomator框架实现的.Appium测试进程与目标应用进程是分开的,所以Appium不能直接访问目标应用的各种element属性进行copy&paste,而只能模拟 ...

  6. AltiumDesigner14绘制四层板设置

    1,快捷键(O+K)进入板层设置界面: 2,选择AddLayer,里边有两个选项(add layer(添加信号层)||add internal plane(增加平面))  四层板的话一般层次的划分是t ...

  7. 自定义silverlight中datagrid的排序事件

    <sdk:DataGrid AutoGenerateColumns="False" CanUserSortColumns="False" CanUserR ...

  8. CentOS环境搭建(JDK安装、mysql安装、hadoop安装等)

    1.1准备权限:让普通用户具备sudo执行权限 切换到root用户,su # vi /etc/sudoers/ 添加  koushengrui    ALL=(ALL)       ALL 这里很容易 ...

  9. Git单独checkout子目录

    http://schacon.github.io/git/git-read-tree.html#_sparse_checkout Existing Repository If you already ...

  10. Tomcat开发技术之与HTTP服务器的集成

    Tomcat最主要的功能是提供Servlet/jsp容器,尽管它也可以作为独立的Java Web服务器,它在对静态资源(如Html文件或图像文件)的处理速度,以及提供的Web服务器治理功能方面都不如其 ...