HDU 1698 Just a Hook 线段树 区间修改
题意:
一个区间编号为1到n,刚开始每个单位的值都为1,然后给出q个操作:u,v,w,把区间[u,v]的单位的值修改为w,问这q个操作后,总区间的值的和。
注意,这道题在输出的时候,我在最后忘了一个 ".",然后就wa了一次。
这个线段树有3个函数,pushup,pushdown,update,(build,query这道题可以省略)。
pushup:更新父亲节点的信息。
pushdown:把父亲节点的信息传递给子节点。
update:更新区间信息。
1 #include<cstdio> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 const int maxn=100000+10; 5 int setv[maxn<<2]; 6 int sum[maxn<<2]; 7 void pushup(int rt) 8 { 9 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 10 } 11 void pushdown(int rt,int len) 12 { 13 if(setv[rt]>0){ 14 setv[rt<<1]=setv[rt<<1|1]=setv[rt]; 15 sum[rt<<1]=setv[rt<<1]*(len-(len>>1)); 16 sum[rt<<1|1]=setv[rt<<1|1]*(len>>1); 17 setv[rt]=0; 18 } 19 } 20 void update(int L,int R,int p,int l,int r,int rt) 21 { 22 if(L<=l&&R>=r){ 23 setv[rt]=p; 24 sum[rt]=p*(r-l+1); 25 return ; 26 } 27 pushdown(rt,r-l+1); 28 int m=(l+r)>>1; 29 if(L<=m) 30 update(L,R,p,lson); 31 if(R>m) 32 update(L,R,p,rson); 33 pushup(rt); 34 } 35 int main() 36 { 37 int test; 38 int cas=0; 39 scanf("%d",&test); 40 while(test--){ 41 cas++; 42 int n,q; 43 scanf("%d",&n); 44 scanf("%d",&q); 45 setv[1]=1; 46 sum[1]=n; 47 int u,v,w; 48 for(int i=0;i<q;i++){ 49 scanf("%d%d%d",&u,&v,&w); 50 update(u,v,w,1,n,1); 51 } 52 printf("Case %d: The total value of the hook is %d.\n",cas,sum[1]); 53 } 54 return 0; 55 }