hdu 1698 Just a Hook (线段树---成段更新)
2014-08-07 08:29
423 查看
用到了懒惰标记lazy[]即我的代码中的col[]。
以前不知道这东西是什么,昨天跟着hh的线段树代码看了一遍。看懂了。。。
就是每次只更新到包含左右端点的最大节点,就停止。
下一次要更新的时候,先把上次未更新到底的往下更新。。。
以前不知道这东西是什么,昨天跟着hh的线段树代码看了一遍。看懂了。。。
就是每次只更新到包含左右端点的最大节点,就停止。
下一次要更新的时候,先把上次未更新到底的往下更新。。。
#include<cstdio> #define maxn 100010 int sum[maxn<<2],col[maxn<<2]; void PushUp(int rt) { sum[rt] = sum[rt<<1]+sum[rt<<1|1]; } void Pushdown(int rt,int m) { if(col[rt]) { col[rt<<1] = col[rt<<1|1] = col[rt]; sum[rt<<1] = (m-(m>>1))*col[rt]; sum[rt<<1|1] = (m>>1)*col[rt]; col[rt] = 0; } } void build(int l,int r,int rt) { col[rt] = 0; sum[rt] = 1; if(l==r) return; int mid = (l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); PushUp(rt); } void update(int le,int ri,int v,int l,int r,int rt) { if(le<=l && r<=ri) { col[rt] = v; sum[rt] = v*(r-l+1); return; } Pushdown(rt,r-l+1); int mid = (l+r)>>1; if(le<=mid) update(le,ri,v,l,mid,rt<<1); if(ri>mid) update(le,ri,v,mid+1,r,rt<<1|1); PushUp(rt); } int main() { int T,n,q,x,y,a; scanf("%d",&T); for(int i=1;i<=T;i++) { scanf("%d",&n); build(1,n,1); scanf("%d",&q); while(q--) { scanf("%d%d%d",&x,&y,&a); update(x,y,a,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0; }
相关文章推荐
- hdu 1698 Just a Hook(线段树成段更新lazy)
- hdu 1698 Just a Hook (线段树)(第二部分 成段更新)
- hdu 1698 Just a Hook 线段树成段更新
- HDU 1698 线段树成段更新 Just a Hook
- 线段树 [成段更新] HDU 1698 Just a Hook
- HDU 1698 Just a Hook (线段树 成段更新)
- HDU 1698 Just a Hook(线段树成段更新)
- hdu 1698 Just a Hook(线段树 成段更新+总区间求和)
- [线段树 段更新] HDU - 1698 E - Just a Hook
- 线段树成段更新 hdu 1698 Just a Hook
- HDU 1698 Just a Hook(线段树成段更新)
- HDU 1698 Just a Hook 线段树(成段更新)
- HDU 1698 Just a Hook 线段树成段更新
- HDU 1698 Just a Hook / 线段树成段更新
- hdu 1698 Just a Hook(线段树成段更新+延迟标记).
- HDU 1698 Just a Hook(线段树成段更新求和)
- [ACM] hdu 1698 Just a Hook (线段树,成段更新,懒惰标记)
- HDU 1698 Just a Hook(线段树lazy成段更新)
- 线段树(成段更新)hdu 1698 Just a Hook
- HDU 1698 Just a Hook(线段树成段更新)