Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:为什么我的程序一直WA,谁能给我一组WA的数据

Posted by gongshaoqing at 2009-11-24 11:16:53 on Problem 3237
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator