hdu1698 线段树成段更新
2017-07-20 15:52
302 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698
成段更新 (通常这对初学者来说是一道坎),需要用到延迟标记
(或者说懒惰标记 ),简单来说
就是每次更新的时候不要更新到底 ,用延迟标记使得更新延迟到下次需要更新or
询问到的
时候
成段更新 (通常这对初学者来说是一道坎),需要用到延迟标记
(或者说懒惰标记 ),简单来说
就是每次更新的时候不要更新到底 ,用延迟标记使得更新延迟到下次需要更新or
询问到的
时候
#include <iostream> #include<cstdio> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int maxn=2e5; int sum[maxn<<2],col[maxn<<2]; void Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt) { col[rt]=0; if(r==l){ sum[rt]=1; return; } int m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } void Pushdown(int rt,int len) { if(col[rt]) { col[rt<<1]=col[rt<<1|1]=col[rt]; sum[rt<<1]=(len-(len>>1))*col[rt]; sum[rt<<1|1]=(len>>1)*col[rt]; col[rt]=0; } } void update(int v,int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { sum[rt]=(r-l+1)*v; col[rt]=v; return ; } Pushdown(rt,r-l+1); int m=(l+r)>>1; if(m>=L)update(v,L,R,lson); if(m<R)update(v,L,R,rson); Pushup(rt); } int main() { int t,n,k,i,a,b,v; int ans=0; while(~scanf("%d",&t)&&t) { while(t--) { printf("Case %d: ",++ans); scanf("%d",&n); build(1,n,1); scanf("%d",&k); while(k--) { scanf("%d %d %d",&a,&b,&v); update(v,a,b,1,n,1); } printf("The total value of the hook is %d.\n",sum[1]); } } return 0; }
相关文章推荐
- HDU1698 Just a Hook(线段树+成段更新+lazy标记)
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- hdu1698(线段树成段更新+lazy标记)
- Hdu1698 Just a Hook(线段树成段更新)
- 线段树 成段更新 hdu1698
- hdu1698 Just a Hook(线段树成段更新lazy)
- 线段树---成段更新hdu1698 Just a Hook
- 【HDU1698】【线段树成段更新】
- 线段树---成段更新hdu1698 Just a Hook
- HDU1698_Just a Hook(线段树/成段更新)
- HDU1698 Just a Hook 【线段树】+【成段更新】+【lazy标记】
- HDU1698_Just a Hook(线段树/成段更新)
- 线段树 区间更新(成段更新) HDU1698
- hdu1698(线段树,简单的成段更新)
- HDU1698 Just a Hook 【线段树】+【成段更新】+【lazy标记】
- 【hdu1698-Just aHook】(线段树成段更新)
- HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)
- hdu 1698 线段树成段更新简单题。
- HDU 1698 Just a Hook(线段树,成段更新)