poj 2892 hdu1540 线段树 求过某点的最大连续区间。
来源:互联网 发布:网络教育学历有用吗 编辑:程序博客网 时间:2024/05/16 10:36
其他与平常的区间合并无异处。
最大难度的地方就是query函数的写法。
见代码。代码注释。
附图理解。
#include <cstdio>#include <stack>#include <algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int Max=50010;int maxn[Max<<2],lmaxn[Max<<2],rmaxn[Max<<2],cov[Max<<2];void pushup(int rt,int m){ lmaxn[rt]=lmaxn[rt<<1];rmaxn[rt]=rmaxn[rt<<1|1];if(lmaxn[rt]==m-(m>>1)) lmaxn[rt]+=lmaxn[rt<<1|1];if(rmaxn[rt]==(m>>1))rmaxn[rt]+=rmaxn[rt<<1];maxn[rt]=max(max(maxn[rt<<1],maxn[rt<<1|1]),lmaxn[rt<<1|1]+rmaxn[rt<<1]);}void build(int l,int r,int rt){maxn[rt]=lmaxn[rt]=rmaxn[rt]=r-l+1; if(l==r)return ;int m=(l+r)>>1;build(lson);build(rson);pushup(rt,r-l+1);}void update(int c,int k,int l,int r,int rt){if(l==r){maxn[rt]=lmaxn[rt]=rmaxn[rt]=k;return ;}int m=(l+r)>>1;if(c<=m) update(c,k,lson);else update(c,k,rson);pushup(rt,r-l+1);}int query(int c,int l,int r,int rt){ if(l==r||maxn[rt]==r-l+1||maxn[rt]==0)return maxn[rt];int m=(l+r)>>1;if(c<=m){if(c>=m-rmaxn[rt<<1]+1) //如果点位于左子树的右连续区间上,则可能要和右子树的左连续区间合并。return query(c,lson)+query(m+1,rson);else //点位于左子树的左连续区间上。无需合并return query(c,lson);}if(c>m){ if(c<=m+lmaxn[rt<<1|1]) //如果点位于右子树的左连续区间上,则可能需要和左子树的右连续区间合并。return query(m,lson)+query(c,rson);else //点位于右子树的右连续区间。无需合并。return query(c,rson);}}int main(){ int n,m,a;scanf("%d %d",&n,&m);build(1,n,1);char ch[2];stack<int >k;while(m--){ scanf("%s%d",ch,&a);if(ch[0]=='D'){update(a,0,1,n,1);k.push(a);}else if(ch[0]=='R'){int t=k.top();update(t,1,1,n,1);k.pop();}else if(ch[0]=='Q')printf("%d\n",query(a,1,n,1));}return 0;}
第一种情况 ,需要和右子树的左连续区间合并。
第二种,无需合并。
第三种,
需要和左子树的右连续区间合并。
第四种。。。。
0 0
- poj 2892 hdu1540 线段树 求过某点的最大连续区间。
- hdu1540(线段树求连续区间最大和)
- HDU1540--线段树(最长连续区间)
- poj 1750Potted Flower(线段树 区间合并 动态规划 区间求最大连续和)
- hdu1540 线段树之区间左右连续询问
- POJ 题目2892 Tunnel Warfare(线段树单点更新查询,求单点所在最大连续区间长度)
- poj 2823 线段树 求固定区间的最大最小值
- HDU1540 Tunnel Warfare(线段树:维护最大连续子串)
- hdu1540(线段树,求点所在线段大小)
- PKU2892(Tunnel Warfare)线段树求最大连续区间
- LA3938 线段树 动态求区间最大连续和
- hdu1540 线段树区间合并
- hdu1540线段树区间合并
- hdu1540(线段树区间合并)
- POJ 3667 Hotel (线段树区间最大连续长度)
- poj 3667 Hotel(线段树求区间连续值)
- 求区间连续不超过K段的最大和--线段树+大量代码
- LightOJ-1399-线段树求区间相同颜色连续的最大长度
- cocos2d-x3.0的HelloWorld
- ghost误操作,整个硬盘只剩一个C盘
- Linux下Pdf Studio的破解
- Google C++编程风格指南
- HDU1867-KMP算法的应用
- poj 2892 hdu1540 线段树 求过某点的最大连续区间。
- hdu1372 Knight Moves(BFS)
- Python_C3_变量【上】
- WebLogin 创建域
- html 弹出div移动居中(好用版)
- iframe的src赋值问题(服务器端)
- 数据库的并发操作
- 基础加强____【集合框架体系个人总结】
- 6sigma 基本概念