| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:为什么我的程序一直WA,谁能给我一组WA的数据In Reply To:为什么我的程序一直WA,谁能给我一组WA的数据 Posted by:fzszjs1z at 2007-06-26 09:53:50 > {$M 64000000}
> program MiameRishio;
> const
> maxn = 10000;
> maxm = maxn shl 1;
> maxlg = 17;
> maxtree = maxn * 8;
> maxst = maxn * 2;
> maxvalue = maxlongint;
> type
> edgetype = record
> go , pre , len : longint;
> end;
> treetype = record
> sign : boolean;
> max , min : longint;
> left , right : longint;
> end;
> var
> test , n , e , stsize , po : longint;
> tree1 , tree2 : longint;
> last , depth , sum : array [ 1..maxn ] of longint;
> get , go , fa2 , treeroot : array [ 1..maxn ] of longint;
> len : array [ 0..maxn ] of longint;
> sa_st , sa_point , sa_edge , fa : array [ 0..maxn ] of longint;
> treeposi , treefirst , size : array [ 1..maxn ] of longint;
> treebelong : array [ 0..maxn ] of longint;
> st , lg : array [ 1..maxst ] of longint;
> visited : array [ 1..maxst ] of boolean;
> edge : array [ 0..maxm ] of edgetype;
> tree : array [ 0..maxtree ] of treetype;
> f : array [ 0..maxlg , 1..maxst ] of longint;
>
> procedure add_edge ( t1 , t2 , t3 : longint );
> begin
> inc ( e );
> edge [ e ] . go := t2;
> edge [ e ] . pre := last [ t1 ];
> edge [ e ] . len := t3;
> last [ t1 ] := e;
> inc ( e );
> edge [ e ] . go := t1;
> edge [ e ] . pre := last [ t2 ];
> edge [ e ] . len := t3;
> last [ t2 ] := e;
> end;
>
> function fmax ( a , b : longint ) : longint;
> begin
> if a > b then fmax := a else fmax := b;
> end;
>
> function fmin ( a , b : longint ) : longint;
> begin
> if a < b then fmin := a else fmin := b;
> end;
>
> procedure init;
> var
> i : longint;
> t1 , t2 , t3 : longint;
>
> begin
> readln;
> readln ( n );
> for i := 1 to n do
> begin
> last [ i ] := 0;
> fa [ i ] := 0;
> go [ i ] := 0;
> depth [ i ] := 0;
> treebelong [ i ] := 0;
> end;
>
> e := 0;
> for i := 1 to n - 1 do
> begin
> readln ( t1 , t2 , t3 );
> add_edge ( t1 , t2 , t3 );
> end;
> end;
>
> procedure dfs ( step , root , lastedge : longint );
> var
> w , tmp , node : longint;
>
> begin
> depth [ root ] := step;
> inc ( stsize );
> st [ stsize ] := root;
> sa_st [ root ] := stsize;
> sum [ root ] := 0;
> sa_point [ root ] := ( lastedge + 1 ) shr 1;
> sa_edge [ ( lastedge + 1 ) shr 1 ] := root;
> len [ ( lastedge + 1 ) shr 1 ] := edge [ lastedge ] . len;
> tmp := 0; node := 0;
> w := last [ root ];
> while w <> 0 do
> begin
> if depth [ edge [ w ] . go ] = 0 then
> begin
> dfs ( step + 1 , edge [ w ] . go , w );
> inc ( stsize );
> st [ stsize ] := root;
> fa2 [ edge [ w ] . go ] := root;
> if sum [ edge [ w ] . go ] > tmp then
> begin
> tmp := sum [ edge [ w ] . go ];
> node := edge [ w ] . go;
> end;
> inc ( sum [ root ] , sum [ edge [ w ] . go ] );
> end;
> w := edge [ w ] . pre;
> end;
> if node <> 0 then
> begin
> fa [ node ] := root;
> go [ root ] := node;
> end;
> inc ( sum [ root ] );
> end;
>
> procedure pass ( x : longint );
> var
> i : longint;
> ch : char;
>
> begin
> for i := 1 to x do read ( ch );
> end;
>
> procedure build_RMQ;
> var
> i , j , len : longint;
>
> begin
> j := 0;
> for i := 1 to stsize do
> begin
> while 1 shl ( j + 1 ) <= i do inc ( j );
> lg [ i ] := j;
> end;
> for i := 1 to stsize do f [ 0 , i ] := st [ i ];
> for i := 1 to maxlg do
> begin
> len := 1 shl i;
> for j := 1 to stsize - len + 1 do
> begin
> if depth [ f [ i - 1 , j ] ] < depth [ f [ i - 1 , j + len shr 1 ] ] then f [ i , j ] := f [ i - 1 , j ]
> else f [ i , j ] := f [ i - 1 , j + len shr 1 ];
> end;
> end;
> end;
>
> procedure swap ( var a , b : longint );
> var
> tmp : longint;
>
> begin
> tmp := a;
> a := b;
> b := tmp;
> end;
>
> function get_RMQ ( a , b : longint ) : longint;
> var
> j : longint;
>
> begin
> if a = b then exit ( a );
> if a > b then swap ( a , b );
> j := lg [ ( b - a + 1 ) ];
> get_RMQ := fmin ( f [ j , a ] , f [ j , b - 1 shl j + 1 ] );
> end;
>
> procedure get_tree ( root : longint );
> begin
> if root = 0 then exit;
> if fa [ root ] <> 0 then
> begin
> inc ( tree2 );
> get [ tree2 ] := sa_point [ root ];
> treeposi [ sa_point [ root ] ] := tree2;
> treebelong [ get [ tree2 ] ] := tree1;
> end;
> get_tree ( go [ root ] );
> visited [ root ] := true;
> end;
>
> procedure build_tree ( x , left , right : longint );
> var
> mid : longint;
>
> begin
> inc ( po );
> if left = right then
> begin
> inc ( e );
> tree [ x ] . max := len [ get [ e ] ];
> tree [ x ] . min := len [ get [ e ] ];
> tree [ x ] . left := 0;
> tree [ x ] . right := 0;
> tree [ x ] . sign := false;
> exit;
> end;
> mid := ( left + right ) shr 1;
> tree [ x ] . left := po + 1;
> build_tree ( po + 1 , left , mid );
> tree [ x ] . right := po + 1;
> build_tree ( po + 1 , mid + 1 , right );
> tree [ x ] . max := fmax ( tree [ tree [ x ] . left ] . max , tree [ tree [ x ] . right ] . max );
> tree [ x ] . min := fmin ( tree [ tree [ x ] . left ] . min , tree [ tree [ x ] . right ] . min );
> tree [ x ] . sign := false;
> end;
>
> procedure build_segment_tree;
> var
> i : longint;
>
> begin
> fillchar ( visited , sizeof ( visited ) , false );
> tree1 := 0;
> po := 0;
> for i := 1 to stsize do
> if ( not visited [ st [ i ] ] ) and ( go [ st [ i ] ] <> 0 ) then
> begin
> inc ( tree1 );
> tree2 := 0;
> get_tree ( st [ i ] );
> e := 0;
> treeroot [ tree1 ] := po + 1;
> treefirst [ tree1 ] := st [ i ];
> size [ tree1 ] := tree2;
> build_tree ( po + 1 , 1 , tree2 );
> end;
> end;
>
> procedure maintain ( x , left ,right : longint );
> var
> lc , rc , tmp : longint;
>
> begin
> if tree [ x ] . sign then
> begin
> tree [ x ] . sign := false;
> if left <> right then
> begin
> tree [ tree [ x ] . left ] . sign := not tree [ tree [ x ] . left ] . sign;
> tree [ tree [ x ] . right ] . sign := not tree [ tree [ x ] . right ] . sign;
> end;
> tmp := tree [ x ] . max;
> tree [ x ] . max := -tree [ x ] . min;
> tree [ x ] . min := -tmp;
> end;
> end;
>
> function tree_find ( x , left , right , t1 , t2 : longint ) : longint;
> var
> mid , tmp : longint;
>
> begin
> maintain ( x , left , right );
> if ( t1 <= left ) and ( right <= t2 ) then exit ( tree [ x ] . max );
> mid := ( left + right ) shr 1;
> tmp := -maxvalue;
> if ( t1 <= mid ) and ( left <= t2 ) then tmp := fmax ( tmp , tree_find ( tree [ x ] . left , left , mid , t1 , t2 ) );
> if ( t1 <= right ) and ( mid + 1 <= t2 ) then tmp := fmax ( tmp , tree_find ( tree [ x ] . right , mid + 1 , right , t1 , t2 ) );
> tree_find := tmp;
> end;
>
> function _query_get ( a , b : longint ) : longint;
> var
> tmp : longint;
>
> begin
> tmp := -maxvalue;
> repeat
> if depth [ a ] <= depth [ b ] then break;
> if fa [ a ] = 0 then
> begin
> tmp := fmax ( tmp , len [ sa_point [ a ] ] );
> a := fa2 [ a ];
> end
> else
> begin
> if treebelong [ sa_point [ a ] ] <> treebelong [ sa_point [ b ] ] then tmp := fmax ( tmp , tree_find ( treeroot [ treebelong [ sa_point [ a ] ] ] , 1 , size [ treebelong [ sa_point [ a ] ] ] , 1 , treeposi [ sa_point [ a ] ] ) )
> else tmp := fmax ( tmp , tree_find ( treeroot [ treebelong [ sa_point [ a ] ] ] , 1 , size [ treebelong [ sa_point [ a ] ] ] , treeposi [ sa_point [ b ] ] + 1 , treeposi [ sa_point [ a ] ] ) );
> a := treefirst [ treebelong [ sa_point [ a ] ] ];
> end;
> until false;
> _query_get := tmp;
> end;
>
> function _query ( a , b : longint ) : longint;
> var
> ance , u , v : longint;
>
> begin
> ance := get_RMQ ( sa_st [ a ] , sa_st [ b ] );
> u := _query_get ( a , ance );
> v := _query_get ( b , ance );
> writeln ( fmax ( u , v ) );
> end;
>
> procedure tree_modify ( x , left , right , k , t : longint );
> var
> mid : longint;
>
> begin
> maintain ( x , left , right );
> if left = right then
> begin
> tree [ x ] . max := t;
> tree [ x ] . min := t;
> exit;
> end;
> mid := ( left + right ) shr 1;
> if k <= mid then tree_modify ( tree [ x ] . left , left , mid , k , t )
> else tree_modify ( tree [ x ] . right , mid + 1 , right , k , t );
> tree [ x ] . max := fmax ( tree [ tree [ x ] . left ] . max , tree [ tree [ x ] . right ] . max );
> tree [ x ] . min := fmin ( tree [ tree [ x ] . left ] . min , tree [ tree [ x ] . right ] . min );
> end;
>
> procedure _change ( a , b : longint );
> begin
> if fa [ sa_edge [ a ] ] = 0 then len [ a ] := b
> else tree_modify ( treeroot [ treebelong [ a ] ] , 1 , size [ treebelong [ a ] ] , treeposi [ a ] , b );
> end;
>
> procedure tree_insert ( x , left , right , t1 , t2 : longint );
> var
> mid : longint;
>
> begin
> maintain ( x , left , right );
> if ( t1 <= left ) and ( right <= t2 ) then
> begin
> tree [ x ] . sign := true;
> maintain ( x , left , right );
> exit;
> end;
> mid := ( left + right ) shr 1;
> if ( t1 <= mid ) and ( left <= t2 ) then tree_insert ( tree [ x ] . left , left , mid , t1 , t2 );
> if ( t1 <= right ) and ( mid + 1 <= t2 ) then tree_insert ( tree [ x ] . right , mid + 1 , right , t1 , t2 );
> tree [ x ] . max := fmax ( tree [ tree [ x ] . left ] . max , tree [ tree [ x ] . right ] . max );
> tree [ x ] . min := fmin ( tree [ tree [ x ] . left ] . min , tree [ tree [ x ] . right ] . min );
> end;
>
> procedure _negate_get ( a , b : longint );
> begin
> repeat
> if depth [ a ] <= depth [ b ] then break;
> if fa [ a ] = 0 then
> begin
> len [ sa_point [ a ] ] := - len [ sa_point [ a ] ];
> a := fa2 [ a ];
> end
> else
> begin
> if treebelong [ sa_point [ a ] ] <> treebelong [ sa_point [ b ] ] then tree_insert ( treeroot [ treebelong [ sa_point [ a ] ] ] , 1 , size [ treebelong [ sa_point [ a ] ] ] , 1 , treeposi [ sa_point [ a ] ] )
> else tree_insert ( treeroot [ treebelong [ sa_point [ a ] ] ] , 1 , size [ treebelong [ sa_point [ a ] ] ] , treeposi [ sa_point [ b ] ] + 1 , treeposi [ sa_point [ a ] ] );
> a := treefirst [ treebelong [ sa_point [ a ] ] ];
> end;
> until false;
> end;
>
> procedure _negate ( a , b : longint );
> var
> ance , u , v : longint;
>
> begin
> ance := get_RMQ ( sa_st [ a ] , sa_st [ b ] );
> _negate_get ( a , ance );
> _negate_get ( b , ance );
> end;
>
> procedure main;
> var
> ch : char;
> t1 , t2 : longint;
>
> begin
> stsize := 0;
> dfs ( 1 , 1 , 0 );
> sa_edge [ 0 ] := 0;
> build_segment_tree;
> build_RMQ;
> repeat
> read ( ch );
> case ch of
> 'Q' : begin
> pass ( 4 );
> readln ( t1 , t2 );
> _query ( t1 , t2 );
> end;
>
> 'C' : begin
> pass ( 5 );
> readln ( t1 , t2 );
> _change ( t1 , t2 );
> end;
>
> 'N' : begin
> pass ( 5 );
> readln ( t1 , t2 );
> _negate ( t1 , t2 );
> end;
>
> 'D' : begin
> pass ( 3 );
> readln;
> exit;
> end;
> end;
> until false;
> end;
>
> begin
> assign ( input , 'pku3237.in' );
> assign ( output , 'pku3237.out' );
> reset ( input );
> rewrite ( output );
> readln ( test );
> for test := 1 to test do
> begin
> init;
> main;
> end;
> close ( input );
> close ( output );
> end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator