线段树二 (持续更新)
来源:互联网 发布:淘宝双十一总销售额 编辑:程序博客网 时间:2024/05/20 17:27
HDU 1689
http://acm.hdu.edu.cn/showproblem.php?pid=1698
这道题是使用懒操作的入门级的题目,在线段树的结构体中,加一个flag标记该区间是否是同色的。当为同色,那么在更新或者查询的时候就可以偷懒了,有效降低时间复杂度。
//hdu 1698#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#define MAX 100010#define lson l,m,k<<1#define rson m+1,r,k<<1|1using namespace std;typedef struct SEG{ int flag,v;}Seg;Seg seg[MAX<<2];void Init(int l,int r,int k){ seg[k].flag = 1; seg[k].v = 1; return ;}void PushDown(int k){ if(seg[k].flag) { seg[k<<1].flag=seg[k<<1|1].flag=1; seg[k<<1].v=seg[k<<1|1].v=seg[k].v; seg[k].flag=0; }}void PushUp(int k){ if(seg[k<<1].flag&&seg[k<<1|1].flag) { if(seg[k<<1].v==seg[k<<1|1].v) { seg[k].flag=1; seg[k].v=seg[k<<1].v; } }}void Update(int ll,int rr,int v,int l,int r,int k){ if(ll==l&&rr==r) { seg[k].flag=1; seg[k].v=v; return; } int m = (l+r)>>1; PushDown(k); if(rr<=m) Update(ll,rr,v,lson); else if(ll>m) Update(ll,rr,v,rson); else { Update(ll,m,v,lson); Update(m+1,rr,v,rson); } PushUp(k);}int Query(int l,int r,int k){ if(seg[k].flag) { return seg[k].v*(r-l+1); } int m = (l+r)>>1; return Query(lson)+Query(rson);}int main(){ int T; int n,q; int x,y,z; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { scanf("%d%d",&n,&q); Init(1,n,1); while(q--) { scanf("%d%d%d",&x,&y,&z); Update(x,y,z,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",cas,Query(1,n,1)); } return 0;}
HDU 3308 LCIS
http://acm.hdu.edu.cn/showproblem.php?pid=3308
这道题应该可以看成是一道区间合并的题目,在结构体中记录左端点起始的最大上升序列长度,右端点结束的最大长度,以及整个区间的最大长度。为了在PushUp的时候方便,我们在记一个左右端点的值。更新很简单,只要更新到叶子节点就行了。
只要在PushUp中注意一下就行了,具体见代码。
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#define lson l,m,k<<1#define rson m+1,r,k<<1|1#define MAX 100100using namespace std;typedef struct SEG{ int lv,rv; int lnum,mnum,rnum;}Seg;Seg seg[MAX<<2];void PushUp(int l,int r,int k){ int m = (l+r)>>1; seg[k].lv=seg[k<<1].lv; seg[k].rv=seg[k<<1|1].rv; if((m-l+1)==seg[k<<1].lnum&&seg[k<<1].rv<seg[k<<1|1].lv) seg[k].lnum=seg[k<<1].lnum+seg[k<<1|1].lnum; else seg[k].lnum=seg[k<<1].lnum; if((r-m)==seg[k<<1|1].rnum&&seg[k<<1].rv<seg[k<<1|1].lv) seg[k].rnum=seg[k<<1|1].rnum+seg[k<<1].rnum; else seg[k].rnum=seg[k<<1|1].rnum; if(seg[k<<1].rv<seg[k<<1|1].lv) seg[k].mnum=max(max(seg[k<<1].mnum,seg[k<<1|1].mnum),seg[k<<1].rnum+seg[k<<1|1].lnum); else seg[k].mnum=max(seg[k<<1].mnum,seg[k<<1|1].mnum); seg[k].mnum=max(seg[k].mnum,max(seg[k].lnum,seg[k].rnum));}void Init(int l,int r,int k){ if(l==r) { scanf("%d",&seg[k].rv); seg[k].lv=seg[k].rv; seg[k].lnum=seg[k].mnum=seg[k].rnum=1; return ; } int m = (l+r)>>1; Init(lson); Init(rson); PushUp(l,r,k);}void Update(int id,int v,int l,int r,int k){ if(l==r) { seg[k].lv=seg[k].rv=v; return ; } int m = (l+r)>>1; if(id<=m) Update(id,v,lson); else Update(id,v,rson); PushUp(l,r,k);}Seg Query(int ll,int rr,int l,int r,int k){ if(ll==l&&rr==r) { return seg[k]; } int m = (l+r)>>1; if(rr<=m) return Query(ll,rr,lson); else if(ll>m) return Query(ll,rr,rson); else { Seg a = Query(ll,m,lson); Seg b = Query(m+1,rr,rson); Seg ans ; ans.lv=a.lv,ans.rv=b.rv; if(a.lnum==(m-ll+1)&&a.rv<b.lv) ans.lnum=a.lnum+b.lnum; else ans.lnum=a.lnum; if(b.rnum==(rr-m)&&a.rv<b.lv) ans.rnum=b.rnum+a.rnum; else ans.rnum=b.rnum; if(a.rv<b.lv) ans.mnum=max(max(a.mnum,b.mnum),a.rnum+b.lnum); else ans.mnum=max(a.mnum,b.mnum); ans.mnum=max(max(ans.lnum,ans.rnum),ans.mnum); return ans; }}int main(){ int T,n,m; char op[4]; int a,b; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Init(1,n,1); while(m--) { scanf("%s%d%d",op,&a,&b); ++a; if(op[0]=='Q') { ++b; Seg ans = Query(a,b,1,n,1); printf("%d\n",ans.mnum); } else Update(a,b,1,n,1); } } return 0;}
- 线段树二 (持续更新)
- 线段树专题(持续更新)
- 【线段树】线段树学习贴(持续更新)
- 【专题总结】树状数组和线段树(持续更新)
- 线段树(二)区间更新
- 线段树(二)区间更新补充
- Java 基础知识巩固(二)--持续更新
- iphone实用技巧二(持续更新)
- [持续更新]JavaScript学习笔记(二)
- [持续更新]HTML5学习笔记(二)
- Linux常用命令二(持续更新)
- NYIST 116 士兵杀敌(二) --- 线段树区间更新
- NYOJ 116 士兵杀敌(二)【线段树 单点更新】
- nyoj116士兵杀敌(二)线段树单点更新
- NYOJ116 士兵杀敌(二)(线段树区单点更新,区间求和,zkw线段树)
- 线段树(单点更新+区间更新)
- 持续更新-jQuery之发微(二)-jQuery html
- Android Studio错误 (持续更新中二)
- oracle---练习创建序列
- android工程导入ADT缺default.properites、JDK版本和Unknown command crunch等问题小结
- charCodeAt的练习
- 《新日语基础教程》学习笔记——第一课
- oracle----创建用户练习
- 线段树二 (持续更新)
- javascript 获取cookies
- 在Eclipse Indigo安装UML2 Tools
- iOS开发历险记
- 桌面宠物:OP版【4.2】
- 距离出生日期的天数(考虑闰年)
- 感慨
- 老调重弹一下,mac上面控制台设置密码的rar与unrar~
- 哈佛的幸福课笔记