成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候
题意:O(-1)
思路:O(-1)
线段树功能:update:成段替换 (由于只query一次总区间,所以可以直接输出1结点的信息)
#include<stdio.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100000 int col[maxn<<2],sum[maxn<<2]; int Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } int build(int l,int r,int rt) { col[rt]=0; sum[rt]=1; if(l==r) return 0; int m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } int Pushdown(int rt,int k) { if(col[rt]) { col[rt<<1]=col[rt<<1|1]=col[rt]; sum[rt<<1]=(k-(k>>1))*col[rt]; sum[rt<<1|1]=(k>>1)*col[rt]; col[rt]=0; } } int query(int L,int R,int Z,int l,int r,int rt) { if(L<=l&&r<=R) { col[rt]=Z; sum[rt]=(r-l+1)*Z; return 0; } Pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) query(L,R,Z,lson); if(R>m) query(L,R,Z,rson); Pushup(rt); } int main() { freopen("hdu1698.in","r",stdin); freopen("hdu1698.out","w",stdout); int ca,i,N,Q,X,Y,Z,j; scanf("%d",&ca); for(i=1;i<=ca;i++) { scanf("%d%d",&N,&Q); build(1,N,1); for(j=1;j<=Q;j++) { scanf("%d%d%d",&X,&Y,&Z); query(X,Y,Z,1,N,1); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0; }