个人的标准写法。
1 /* 2 线段树+修改区间+询问区间 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<vector> 11 #include<map> 12 #include<math.h> 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 100005; 16 const int maxm = 1005; 17 const int inf = 0x7FFFFFFF; 18 const double pi = acos(-1.0); 19 const double eps = 1e-8; 20 using namespace std; 21 #define LEFT( x ) (x<<1) 22 #define RIGHT( x ) ((x<<1)+1) 23 struct node{ 24 int l,r,sum; 25 int flag; 26 }tree[ maxn<<2 ]; 27 int data[ maxn ]; 28 void pushup( int n ){ 29 tree[ n ].sum = tree[ LEFT( n ) ].sum+tree[ RIGHT( n ) ].sum; 30 return ; 31 } 32 void pushdown( int n,int m ){//下标为n,这段区间有m个数 33 if( tree[ n ].flag!=0 ){ 34 tree[ LEFT( n ) ].flag = tree[ RIGHT( n ) ].flag = tree[ n ].flag; 35 tree[ LEFT( n ) ].sum = tree[ n ].flag*(m-m/2);//tree[ n ].flag*((m+1)/2); 36 tree[ RIGHT( n ) ].sum = tree[ n ].flag*(m/2);//tree[ n ].flag*( m-(m+1)/2 ); 37 tree[ n ].flag = 0; 38 } 39 return; 40 } 41 void build( int l,int r,int n ){ 42 if( l==r ){ 43 tree[ n ].sum = data[ l ]; 44 tree[ n ].flag = 0; 45 tree[ n ].l=tree[ n ].r = l; 46 return ; 47 } 48 tree[ n ].flag = 0; 49 tree[ n ].l = l; 50 tree[ n ].r = r; 51 int mid; 52 mid = (l+r)>>1; 53 build( l,mid,LEFT( n ) ); 54 build( mid+1,r,RIGHT( n ) ); 55 pushup( n ); 56 return; 57 } 58 void update( int a,int b,int c,int l,int r,int n ){ 59 if( a==l&&b==r ){ 60 tree[ n ].flag = c; 61 tree[ n ].sum = (r-l+1)*c; 62 return ; 63 } 64 pushdown( n,r-l+1 ); 65 //printf("test\n"); 66 int mid; 67 mid = (l+r)>>1; 68 if( mid>=b ) update( a,b,c,l,mid,LEFT( n ) ); 69 else if( mid<a ) update( a,b,c,mid+1,r,RIGHT( n )); 70 else { 71 update( a,mid,c,l,mid,LEFT( n ) ); 72 update( mid+1,b,c,mid+1,r,RIGHT( n ) ); 73 } 74 pushup( n ); 75 return ; 76 } 77 int query( int a,int b,int l,int r,int n ){ 78 if( a==l&&b==r ){ 79 return tree[ n ].sum; 80 } 81 pushdown( n,r-l+1 ); 82 int mid; 83 mid = (l+r)>>1; 84 if( mid>=b ) return query( a,b,l,mid,LEFT( n ) ); 85 else if( mid<a ) return query( a,b,mid+1,r,RIGHT( n )); 86 else return query( a,mid,l,mid,LEFT( n ) )+query( mid+1,b,mid+1,r,RIGHT( n )); 87 } 88 int main(){ 89 int ca; 90 scanf("%d",&ca); 91 for( int t=1;t<=ca;t++ ){ 92 int n; 93 scanf("%d",&n); 94 for( int i=1;i<=n;i++ ){ 95 data[ i ] = 1; 96 } 97 build( 1,n,1 ); 98 int op; 99 scanf("%d",&op); 100 while( op-- ){ 101 int a,b,c; 102 scanf("%d%d%d",&a,&b,&c); 103 update( a,b,c,1,n,1 ); 104 } 105 printf("Case %d: The total value of the hook is %d.\n",t,tree[ 1 ].sum); 106 } 107 return 0; 108 }
另一种写法。
1 /* 2 线段树 3 成段更新 4 */ 5 #include<stdio.h> 6 const int maxn = 100005; 7 int sum[ maxn<<2 ]; 8 int col[ maxn<<2 ]; 9 #define lson l,mid,rt<<1 10 #define rson mid+1,r,rt<<1|1 11 12 void PushUp( int rt ){ 13 sum[ rt ]=sum[ rt<<1 ]+sum[ rt<<1|1 ]; 14 return ; 15 } 16 void PushDown( int rt,int m ){ 17 if( col[ rt ] ){ 18 col[ rt<<1 ]=col[ rt<<1|1 ]=col[ rt ]; 19 sum[ rt<<1 ]=(m-m/2)*col[ rt ]; 20 sum[ rt<<1|1 ]=(m/2)*col[ rt ]; 21 col[ rt ]=0; 22 } 23 } 24 25 void build( int l,int r,int rt ){ 26 sum[ rt ]=1; 27 col[ rt ]=0; 28 if( l==r ){ 29 return ; 30 } 31 int mid; 32 mid=(l+r)>>1; 33 build( lson ); 34 build( rson ); 35 PushUp( rt ); 36 return ; 37 } 38 39 void update( int a,int b,int c,int l,int r,int rt ){ 40 if( a<=l && b>=r ){ 41 col[ rt ]=c; 42 sum[ rt ]=(r-l+1)*c; 43 return ; 44 } 45 PushDown( rt,r-l+1 ); 46 int mid; 47 mid=(l+r)>>1; 48 if( a<=mid ) update( a,b,c,lson ); 49 if( b>mid ) update( a,b,c,rson ); 50 PushUp( rt ); 51 return ; 52 } 53 /* 54 int query( int a,int b,int l,int r,int rt ){ 55 if( a==l && b==r ){ 56 return sum[ rt ]; 57 } 58 int mid; 59 mid=(l+r)>>1; 60 int t1,t2; 61 if( b<=mid ) return query( a,b,lson ); 62 else if( a>mid ) return query( a,b,rson ); 63 else return query( a,mid,lson )+query( mid+1,b,rson ); 64 } 65 */ 66 int main(){ 67 int T; 68 scanf("%d",&T); 69 for(int i=1;i<=T;i++ ){ 70 int n; 71 scanf("%d",&n); 72 build( 1,n,1 ); 73 int t; 74 scanf("%d",&t); 75 int a,b,c; 76 while( t-- ){ 77 scanf("%d%d%d",&a,&b,&c); 78 update( a,b,c,1,n,1 ); 79 //for( int j=1;j<=25;j++ )printf("j:%d %d\n",j,sum[j]); 80 } 81 printf("Case %d: The total value of the hook is %d.\n",i,sum[ 1 ]/*query( 1,n,1,n,1 )*/ ); 82 } 83 return 0; 84 }