您的位置:首页 > 其它

hdu 4902 线段树-成段更新

2014-08-01 22:49 423 查看
貌似是姿势正确的暴力也能过。。。。。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

__int64 sum[810000];
__int64 add[810000];
__int64 N, Q;

__int64 lc( __int64 root ){
return 2 * root;
}

__int64 rc( __int64 root ){
return 2 * root + 1;
}

__int64 gcd( __int64 a, __int64 b ){
if( a == 0 && b == 0 ){
return 0;
}
if( b == 0 ){
return a;
}
if( a < b ){
return gcd( b, a );
}
return !b ? a : gcd( b, a % b );
}

void PushUp( __int64 root ){
sum[root] = sum[lc(root)] + sum[rc(root)];
}

void built( __int64 l, __int64 r, __int64 root ){
if( l == r ){
scanf( "%I64d", &sum[root] );
add[root] = sum[root];
return;
}
__int64 mid = ( l + r ) / 2;
built( l, mid, lc( root ) );
built( mid + 1, r, rc( root ) );
add[root] = -1;
PushUp( root );
}

void PushDown( __int64 root, __int64 l, __int64 r ){
if( add[root] != -1 ){
add[lc(root)] = add[root];
add[rc(root)] = add[root];
sum[lc(root)] = add[root] * ( ( l + r ) / 2 - l + 1 );
sum[rc(root)] = add[root] * ( r - ( l + r ) / 2 );
add[root] = -1;
}
}

void out( __int64 L, __int64 R, __int64 l, __int64 r, __int64 root ){
if( l == r ){
printf( "%I64d ", sum[root] );
return;
}
PushDown( root, l, r );
__int64 mid = ( l + r ) / 2;
if( L <= mid )  out( L, R, l, mid, lc( root ) );
if( R > mid )  out( L, R, mid + 1, r, rc( root ) );
PushUp( root );
}

void change1( __int64 num, __int64 L, __int64 R, __int64 l, __int64 r, __int64 root ){
if( L <= l && R >= r ){
add[root] = num;
sum[root] = num * ( r - l + 1 );
return;
}
PushDown( root, l, r );
__int64 mid = ( l + r ) / 2;
if( L <= mid )  change1( num, L, R, l, mid, lc( root ) );
if( R > mid )   change1( num, L, R, mid + 1, r, rc( root ) );
PushUp( root );
}

void change2( __int64 num, __int64 L, __int64 R, __int64 l, __int64 r, __int64 root ){
if( L <= l && R >= r && add[root] != -1 ){
if( add[root] > num ){
add[root] = gcd( add[root], num );
sum[root] = add[root] * ( r - l + 1 );
}
return;
}
PushDown( root, l, r );
__int64 mid = ( l + r ) / 2;
if( L <= mid )  change2( num, L, R, l, mid, lc( root ) );
if( R > mid )   change2( num, L, R, mid + 1, r, rc( root ) );
PushUp( root );
}
int main(){
int T;
scanf( "%d", &T );
while( T-- ){
scanf( "%I64d", &N );
built( 1, N, 1 );
scanf( "%I64d", &Q );
for( __int64 i = 0; i < Q; i++ ){
__int64 temp1, temp2, temp3, temp4;
scanf( "%I64d%I64d%I64d%I64d", &temp1, &temp2, &temp3, &temp4 );
if( temp1 == 1 ){
change1( temp4, temp2, temp3, 1, N, 1 );
}else{
change2( temp4, temp2, temp3, 1, N, 1 );
}
}
out( 1, N, 1, N, 1 );
printf( "\n" );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: