线段树--区间合并--HDU 1540
来源:互联网 发布:热点软件 编辑:程序博客网 时间:2024/06/07 06:29
题意:
题意:D: 破坏村庄,R:修复最后一个破损的村庄,Q:查找X在内的连续区间值有多少
思路:
建立线段树,维护左右区间值。注意维护变量为: 从左编开始最大连续值,从右边开始最大值,最大连续值
为了维护最后一个被破坏的。需要时刻记录,并且不能只单纯记录一个,而是需要记录顺序。满足先入后出的栈操作,传参即可
#include <iostream>#define lson i<<1,left,mid#define rson i<<1|1,mid+1,right#include <stdio.h>#include <cstring>using namespace std;#define maxn 50010int s[maxn],top;int n,m;struct TreeNode{ int left; int right; int ls,rs,ms;}a[maxn*3];void Build(int i,int left,int right){ a[i].ls=a[i].rs=a[i].ms=right-left+1; a[i].left=left; a[i].right=right; if(left==right) return ; int mid=(left+right)>>1; Build(lson); Build(rson);}void insert(int i,int t,int x){ if(a[i].left==a[i].right) { if(x==1) a[i].ls=a[i].rs=a[i].ms=1; else a[i].ls=a[i].rs=a[i].ms=0; return ; } int mid=(a[i].left+a[i].right)>>1; if(t<=mid) insert(i<<1,t,x); else insert(i<<1|1,t,x); a[i].ls=a[i<<1].ls; a[i].rs=a[i<<1|1].rs; a[i].ms=max(max(a[i<<1].ms,a[i<<1|1].ms),a[i<<1].rs+a[i<<1|1].ls); if(a[i<<1].ls==a[i<<1].right-a[i<<1].left+1) a[i].ls+=a[i<<1|1].ls; if(a[i<<1|1].rs==a[i<<1|1].right-a[i<<1|1].left+1) a[i].rs+=a[i<<1].rs;}int query(int i,int t){ if(a[i].left==a[i].right||a[i].ms==a[i].right-a[i].left+1) return a[i].ms; int mid=(a[i].left+a[i].right)>>1; if(t<=mid) { if(t>=a[i<<1].right-a[i<<1].rs+1) return query(i<<1,t)+query(i<<1|1,mid+1); else return query(i<<1,t); } else { if(t<=a[i<<1|1].left+a[i<<1|1].ls-1) return query(i<<1|1,t)+query(i<<1,mid); else return query(i<<1|1,t); }}int main(){ int i,j,x; char ch[2]; while(~scanf("%d%d",&n,&m)) { top = 0; Build(1,1,n); while(m--) { scanf("%s",ch); if(ch[0] == 'D') { scanf("%d",&x); s[top++] = x; insert(1,x,0); } else if(ch[0] == 'Q') { scanf("%d",&x); printf("%d\n",query(1,x)); } else { if(x>0) { x = s[--top]; insert(1,x,1); } } } } return 0;}
0 0
- hdu 1540 线段树区间合并
- hdu 1540 线段树+区间合并
- hdu 1540 线段树区间合并
- 线段树--区间合并--HDU 1540
- HDU 1540 线段树区间合并
- hdu 1540 线段树(区间合并入门)
- 线段树--区间合并hdu--1540
- HDU-1540 Tunnel Warfare 线段树 区间合并
- hdu 1540 Tunnel Warfare(线段树区间合并)
- hdu 1540 & poj 2892 Tunnel Warfare 线段树区间合并
- HDU 1540 POJ 2892 线段树区间合并
- 【Hdu】1540 Tunnel Warfare(线段树|区间合并)
- HDU 1540 Tunnel Warfare(线段树 区间合并 +单点更新)
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
- HDU 1540 Tunnel Warfare(线段树区间合并)
- HDU 1540 Tunnel Warfare (线段树区间合并)
- HDU - 1540 Tunnel Warfare(线段树 区间合并)
- hdu 1540 Tunnel Warfare (线段树区间合并)
- 安装配置Hadoop
- 玛丽卡(spfa删边求最短路)
- 对称算法(计算机图形学)
- Linux grep命令详解
- PAT甲级A1014. Waiting in Line (30)
- 线段树--区间合并--HDU 1540
- redhat 软件包管理
- Collcition的作用及意义
- Spring Transaction属性之propagation
- 2015华为机试练习之合唱队
- Sql Server中GO的作用
- Android的SQLite应用
- linux下,在QT中如何导入第三方的库文件
- 【zzuliOJ】1908 - 小火山的围棋梦想(dfs)