裸的线段树
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int val[410000], flag[410000];
int N;
int lc( int root ){
return root * 2;
}
int rc( int root ){
return root * 2 + 1;
}
void pushup( int root ){
val[root] = val[lc(root)] + val[rc(root)];
}
void built( int l, int r, int root ){
val[root] = 1;
flag[root] = 0;
if( l == r ){
return;
}
int mid = ( l + r ) / 2;
built( l, mid, lc(root) );
built( mid + 1, r, rc(root) );
pushup( root );
}
void pushdown( int root, int m ){
if( flag[root] ){
flag[lc(root)] = flag[rc(root)] = flag[root];
val[lc(root)] = ( m - m / 2 ) * flag[root];
val[rc(root)] = ( m / 2 ) * flag[root];
flag[root] = 0;
}
}
void operat( int v, int L, int R, int l, int r, int root ){
if( L <= l && R >= r ){
val[root] = ( r - l + 1 ) * v;
flag[root] = v;
return;
}
pushdown( root, r - l + 1 );
int mid = ( l + r ) / 2;
if( L <= mid ){
operat( v, L, R, l, mid, lc(root) );
}
if( R > mid ){
operat( v, L, R, mid + 1, r, rc(root) );
}
pushup( root );
return;
}
int main(){
int T, M, Case = 1;
cin >> T;
while( T-- ){
cin >> N;
built( 1, N, 1 );
cin >> M;
memset( flag, 0, sizeof( flag ) );
while( M-- ){
int temp1, temp2, temp3;
scanf( "%d%d%d", &temp1, &temp2, &temp3 );
operat( temp3, temp1, temp2, 1, N, 1 );
}
printf( "Case %d: The total value of the hook is %d.\n", Case++, val[1] );
}
return 0;
}