hdu 1698 Just a Hook 线段树
线段树的区间修改
#include <stdio.h> #define maxn 100100 int set[4*maxn],sum[4*maxn]; void push(int o,int m) { if(set[o]) { set[2*o]=set[2*o+1]=set[o]; sum[2*o]=(m-(m/2))*set[o]; sum[2*o+1]=(m/2)*set[o]; set[o]=0; } } void build(int l,int r,int o) { int m=(l+r)/2; set[o]=0; sum[o]=1; if(l==r) return ; build(l,m,2*o); build(m+1,r,2*o+1); sum[o]=sum[2*o]+sum[2*o+1]; } void update(int ql,int qr,int c,int l,int r,int o) { if(ql<=l&&r<=qr) { set[o]=c; sum[o]=c*(r-l+1); return ; } push(o,r-l+1); int m=(l+r)/2; if(ql<=m) update(ql,qr,c,l,m,2*o); if(qr>m) update(ql,qr,c,m+1,r,2*o+1); sum[o]=sum[2*o]+sum[2*o+1]; } int main() { int cas,i,j; int n,m; scanf("%d",&cas); for(j=1;j<=cas;j++) { scanf("%d%d",&n,&m); build(1,n,1); for(i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",j,sum[1]); } return 0; }