1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 using namespace std; 7 int yy2,yy1,v,fsum; 8 int sumv[1000005],setv[1000005]; 9 10 void maintain(int o,int l,int r) 11 { 12 int lc=o*2,rc=o*2+1; 13 sumv[o]=0; 14 if (setv[o]>=0) sumv[o]=setv[o]*(r-l+1); 15 else if (r>l) sumv[o]+=sumv[lc]+sumv[rc]; 16 } 17 void update(int o,int l,int r) 18 { 19 int lc=o*2,rc=o*2+1; 20 if (yy1<=l&&yy2>=r) setv[o]=v; 21 else{ 22 if (setv[o]>=0)//pushdown 23 { 24 setv[lc]=setv[rc]=setv[o]; 25 setv[o]=-1; 26 } 27 int mid=l+(r-l)/2; 28 if (yy1<=mid) update(lc,l,mid); else maintain(lc,l,mid); 29 if (yy2>mid) update(rc,mid+1,r); else maintain(rc,mid+1,r); 30 } 31 maintain(o,l,r); 32 } 33 void query(int o,int l,int r) 34 { 35 if (setv[o]>=0) fsum+=setv[o]*(min(r,yy2)-max(l,yy1)+1); 36 else if (yy1<=l&&yy2>=r) fsum+=sumv[o]; 37 else { 38 int mid=l+(r-l)/2; 39 if (yy1<=mid) query(o*2,l,mid); 40 if (yy2>mid) query(o*2+1,mid+1,r); 41 } 42 } 43 int main() 44 { 45 int T,t,n,m,i; 46 scanf("%d",&T); 47 for (t=1;t<=T;t++) 48 { 49 scanf("%d%d",&n,&m); 50 /* memset(setv,0,sizeof(setv)); 51 memset(sumv,0,sizeof(sumv));*/ 52 yy1=1; yy2=n; v=1; 53 update(1,1,n); 54 for (i=1;i<=m;i++) 55 { 56 scanf("%d%d%d",&yy1,&yy2,&v); 57 update(1,1,n); 58 } 59 fsum=0; yy1=1; yy2=n; query(1,1,n); 60 printf("Case %d: The total value of the hook is %d.\n",t,fsum); 61 } 62 }
转载于:https://www.cnblogs.com/xiao-xin/articles/3862733.html