这道题居然以dota为背景,很受寝室同学的关注。
自己写的延迟,后来发现错误了,看了ppt的思想,该写了好久。1A
#include<stdio.h> struct st { int l; int r; int color; int num; }f[100002*4]; int sum1; #define HH 1 void build(int l,int r,int n) { int mid=(l+r)/2; f[n].l=l; f[n].r=r; f[n].num=1; f[n].color=0; if(l<r) { build(l,mid,n*2); build(mid+1,r,n*2+1); } } void update(int l,int r,int num,int n) { int mid=(f[n].l+f[n].r)/2; if(f[n].l==l&&f[n].r==r) { f[n].num=num; f[n].color=0; return ; } //if(f[n].num==num) continue; cuo wu if(f[n].color==0) { f[n].color=HH; f[n*2].num=f[n].num; f[n*2+1].num=f[n].num; f[n*2].color=0; // f[n*2+1].color=0; // } if(mid>=r) update(l,r,num,n*2); else if(mid<l) update(l,r,num,n*2+1); else { update(l,mid,num,n*2); update(mid+1,r,num,n*2+1); } } void getsum(int l,int r,int n) { int mid=(f[n].l+f[n].r)/2; if(f[n].l==l&&f[n].r==r&&f[n].color==0) { // printf("%d %d %d\n",f[n].l,f[n].r,f[n].num); sum1=sum1+(f[n].r-f[n].l+1)*f[n].num; } else if(mid>=r) getsum(l,r,n*2); else if(mid<l) getsum(l,r,n*2+1); else { getsum(l,mid,n*2); getsum(mid+1,r,n*2+1); } } int main() { int i,t,time,n,m,l,r,num; while(scanf("%d",&t)>0) { time=0; while(t--) { scanf("%d",&n); build(1,n,1); scanf("%d",&m); sum1=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&l,&r,&num); update(l,r,num,1); } getsum(1,n,1); printf("Case %d: The total value of the hook is %d.\n",++time,sum1); } } return 0; }