转载请注明出处:http://blog.csdn.net/a1dark
分析:说到这题、满脸都是泪。。、本应该轻松1A的、结果由于我的初始化mark的时候、没注意到就把mark放到if(l==r)条件判断里面了、这样就只能初始化到最低层的节点、无语了啊、找了好久的错误、泪流满面。。
其实这题还有一个做法、因为是不断覆盖、可以逆序模拟这个过程、是可以暴力过的
#include<stdio.h> #define N 100225 struct node{ int l,r; int sum,mark; }tree[N<<2]; int n,ans; void create(int x,int l,int r){ tree[x].l=l; tree[x].r=r; tree[x].mark=0; int mid=(l+r)/2; if(l==r){ tree[x].sum=1; return; } create(x*2,l,mid); create(x*2+1,mid+1,r); tree[x].sum=tree[x*2].sum+tree[x*2+1].sum; } void pushdown(int x){ if(tree[x].mark){ tree[x*2].mark=tree[x].mark; tree[x*2+1].mark=tree[x].mark; tree[x*2].sum=(tree[x*2].r-tree[x*2].l+1)*tree[x].mark; tree[x*2+1].sum=(tree[x*2+1].r-tree[x*2+1].l+1)*tree[x].mark; tree[x].mark=0; } } void update(int x,int l,int r,int num){ if(l<=tree[x].l&&r>=tree[x].r){ tree[x].mark=num; tree[x].sum=num*(tree[x].r-tree[x].l+1); return; } pushdown(x); int mid=(tree[x].l+tree[x].r)/2; if(l<=mid) update(x*2,l,r,num); if(r>mid) update(x*2+1,l,r,num); tree[x].sum=tree[x*2].sum+tree[x*2+1].sum; } int main(){ int t,m,i,x,y,num,k=1; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); create(1,1,n); for(i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&num); update(1,x,y,num); } printf("Case %d: The total value of the hook is %d.\n",k,tree[1].sum); k++; } return 0; }