color标记待更新,更新完标记为0;
#include<cstdio> #define M 100005 #define mid (l+r)>>1 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int color[M<<2],sum[M<<2]; void PushPlus(int rt){ sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void PushSub(int rt,int m){ if(color[rt]){ color[rt<<1] = color[rt<<1|1] = color[rt]; sum[rt<<1|1] = (m>>1 ) *color[rt]; sum[rt<<1] = ( m - (m>>1) ) *color[rt]; color[rt] = 0; } } void Bulid(int l,int r,int rt){ color[rt] = 0; if(l == r){ sum[rt] = 1; return ; } int m = mid; Bulid(lson); Bulid(rson); PushPlus(rt); } void Updata(int x,int L,int R,int l,int r,int rt){ if( L <= l && r <= R ){ sum[rt] = (r-l+1)*x; color[rt] = x; return ; } PushSub(rt,r-l+1); int m = mid ; if(L <= m) Updata(x,L,R,lson); if(R > m) Updata(x,L,R,rson); PushPlus(rt); } int main(){ int cas,a,b,c,n,m; scanf("%d",&cas); for(int i=1;i<=cas;i++){ scanf("%d %d",&n,&m); Bulid(1,n,1); while(m--){ scanf("%d %d %d",&a,&b,&c); Updata(c,a,b,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0; }