HDU 1540<线段树,区间并>
题意:
维护各个点的连续的最大连续长度。
思路:
主要是维护一个区间的三个变量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<线段树,区间并>的更多相关文章
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- HDU - 1540 线段树的合并
这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...
- E - Just a Hook HDU - 1698 线段树区间修改区间和模版题
题意 给出一段初始化全为1的区间 后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3911 线段树区间合并
北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...
- HDU - 1698 线段树区间修改,区间查询
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...
- HDU 5023线段树区间染色,统计区间内颜色个数
这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...
- hdu 1540 线段树
这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...
随机推荐
- C++ 内存分析-valgrind
valgrind包括了以下几个比较重要的模块:memcheck, cachegrind, callgrind, helgrind, drd, massif, dhat, sgcheck, bbv. 还 ...
- Caf音频文件混合
一.两个同样时常的caf音频文件,可以通过下面的代码混合 二.代码地址: https://github.com/liqiushui/AudioRecorderCafMix
- java实现UDP聊天---转载
import java.io.*; import java.net.*; class Send implements Runnable { private DatagramSocket ds; pub ...
- 利用python httplib模块 发送Post请求测试web服务是否正常起来!
最近在学习python,恰好老大最近让我搞个基于post请求测试web服务是否正常启用的小监控,上网查了下资料,发现强大的Python恰好能够用上,所以自己现学现卖,顺便锻炼下自己. 由于本人也刚接触 ...
- 关于css的hack问题
<!--[if <keywords>? IE <version>?]> HTML代码块 <![endif]--> 取值: <keywords> ...
- vs打开项目,创建虚拟目录,提示权限不足无法写入配置文件
如题,从源代码管理器上获取下来程序后,自己打开始,提示如题,尝试过以管理员启动vs,给目录权限提升,修改csproj项目配置文件(修改userIIS节点)and so on,无意间在用别的文档编辑器编 ...
- 远程桌面协议浅析(VNC/SPICE/RDP)
由于最近项目涉及到虚拟桌面,就花了点时间找了点资料看了一下,目前常用的协议有VNC/SPICE/RDP三种,就在这里做一个简单的介绍. 三种协议的对比 SPICE VNC RDP BIOS屏幕显示 能 ...
- ios xcode中所有自带的字体如下(最好结合NSMutableAttributedString相结合使用)
// 打印系统中所有字体的类型名字 NSArray *familyNames = [UIFont familyNames]; for(NSString *familyName in familyNam ...
- 理解VMware虚拟机下网络连接的三种模式(如何配置虚拟机上网)
很多朋友都用vmware来测试不同的系统,我结合自己的经验谈一下对网络设置的理解,不对的地方请指正. bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两 ...
- Internet History, Technology and Security (Get Started)
Abstract 课程名称:互联网的历史.技术和安全 coursera地址 制作方:密歇根大学(University of Michigan) 教师:Charles Severance, Associ ...