http://acm.hdu.edu.cn/showproblem.php?pid=1698
做的第一道线段树成段更新的题目,lazy标志起到的作用的延迟更新(为了保证O(logN)的效率,不延迟就变成O(N))。这道题反正就询问一次,最后直接输出即可。
View Code
#include <iostream> using namespace std ; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=100002 ; int sum[maxn<<2] ; int lazy[maxn<<2] ; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1] ; } void pushdown(int rt,int m) { if(lazy[rt]) { lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt] ; sum[rt<<1]=(m-(m>>1))*lazy[rt] ; sum[rt<<1|1]=(m>>1)*lazy[rt] ; lazy[rt]=0 ; } } void build(int l,int r,int rt) { lazy[rt]=0 ; sum[rt]=1 ; if(l==r) return ; int m=(l+r)>>1 ; build(lson) ; build(rson) ; pushup(rt) ; } void update(int L,int R,int p,int l,int r,int rt) { if(L<=l && R>=r) { lazy[rt]=p ; sum[rt]=p*(r-l+1) ; return ; } pushdown(rt,r-l+1) ; int m=(l+r)>>1 ; if(L<=m) update(L,R,p,lson) ; if(R>m) update(L,R,p,rson) ; pushup(rt) ; } int main() { int t ; scanf("%d",&t) ; for(int cas=1;cas<=t;cas++) { int n ; scanf("%d",&n) ; build(1,n,1) ; int q ; scanf("%d",&q) ; while(q--) { int a,b,w ; scanf("%d%d%d",&a,&b,&w) ; update(a,b,w,1,n,1) ; } printf("Case %d: The total value of the hook is %d.\n",cas,sum[1]) ; } return 0 ; }