hdu 4902 线段树-成段更新
2014-08-01 22:49
423 查看
貌似是姿势正确的暴力也能过。。。。。
AC代码如下:
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; }
相关文章推荐
- hdu 4902 线段树
- hdu 5419 Victor and Toys 线段树成段更新
- 2014多校第四场1006 HDU 4902 Nice boat 线段树 区间更新问题
- HDU1698 Just a Hook 线段树成段更新
- hdu5023 线段树成段更新
- hdu-4578 Transformation 线段树成段更新
- hdu 4902 Nice boat(线段树区间更新lazytag·单点更新)
- 线段树(成段更新) HDU 1698 Just a Hook
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
- hdu1698 Just a Hook 线段树,成段更新
- HDU 1698 Just a Hook 线段树成段更新
- hdu 1698 线段树成段更新
- 【hdu】 Just a Hook (线段树 -成段更新,延迟标记)
- hdu 4348 To the moon(线段树成段更新) 2012 Multi-University Training Contest 5
- hdu 2871 线段树 成段更新+STL
- hdu 1698 线段树 成段更新
- hdu 1698 Just a Hook (线段树---成段更新)
- 树状数组,线段树(区间成段更新,HDU 4267)
- HDU 3974 Assign the task(dfs时间戳+线段树成段更新)
- HDU Assign the task(dfs编号+线段树成段更新)