1433デジタル問題の解決の問題(標準IO)

説明

  :アリスはN * Nの格子を有し、表中に充填上から下へ、左から右へ順番に1-N ^ 2は、フォーム上の2つの操作が可能となる
  。この行を- (1)線を回転させます移動つの位置の数、および最初の列の最後の列の数は、あろう;
  (2)カラムを回転-この行の数が一つの位置、する最初の行の最後の行の数を下降させます。
  アリスはメソッドのX(R、C)を移動させたい番号を使用することができる:
  •Xは、C列にない場合、Xの行の回転によって動作するC列を移動し、
  •XがラインRにない場合、カラムの操作を回転させることによりXは、Rラインに移動しました。
  下記(3、4)を移動し6の例である:
  
  今上記の方法のようなアリス、注文番号Kは、それぞれの目標位置に移動する、番号が各プログラミングのために計算されるいくつかの操作を必要とします。
 

入力

  最初の行は二つの整数N(12 <= N <=含有 10000) 及びK(1 <= K <= 1000)。
  次のK行は、三つの整数のX(1 <=のX <=含む各行 N ^ 2)は、R とC(1 <= R、C <= N)、 移動させることが記載され、宛先番号です。
  アリスは、順次入力順序を移動させなければなりません。

出力

  K出力線、各出力操作の数を表す整数。
 

サンプル入力

入力1:
4 1 
。6 3. 4 

入力2:
4 2 
。6. 4 3 
。6 2 2 

入力3 
。5 3 
1 2 2 
2 2 2 
12 5. 5。

サンプル出力

出力1:
3 

出力2:
3 
。5 

アウトプット3:
2 
。5 
3

  我々は、データの範囲を見ての質問は、Nが<= 10000は、私たちが知っている、それぞれのポイントを記録するために2次元配列を取ることなく、時間の複雑さはNに依存することはできませんので、我々は唯一のKすることができます各照会のために、答えは実際には非常に良い数で、開始が、より困難は、他の場所の初期数の操作への影響は、私たちは二つの構造配列x [i]と[Yを設定することができ、それぞれの答えの後に計算されますi]は、それぞれ、今、2つの要素を移動します。線の動きので、移動Xのi番目のX軸及びY軸方向に移動されたどのように多くの求め、X [i]は.now操作にこの時間を示し、どのラインを(示し、したがってその列Yを示すために使用、唯一同じYので、xは同じではない)、数を示し、右に移動し、Y [i]を(再度、数、同じXは、Yが同じでない移動列の動作を示す.now、ダウン再び被写体Xianxiang右、上の規定は、私たちは最初にタイムライン操作、計算列を計算するために示されるX)は、動きは、携帯電話番号を表します。

  我々それぞれの新しい動作は、計算を行う、現在の実際の位置を通過するために、この数のうち、前回の運転行移動列番号、一つずつ中に保存されます。

  現在の座標は、座標に到達するよりも大きくなるように非常に簡単な計算、2例、1(xがyの両方のために座標、座標)、次いで直接差分演算を何度も実行される差し引いた、XY知られていますあなたは、出力の回答をすることができ、要件を満たしています。それよりも到達する約2だけではなく、最初の部門に戻っボーダーに達した後、振り返ってみると、私たちの事業は唯一の後方に下がることができ座標座標今小さい、質問1に変換。

コード:

書式#include <iostreamの> 
の#include <cstdioを>
 使用して 名前空間はstdを、
構造体の数{
     長い 長い移動。
    長い 長い今、
} X [ 1010 ]、Y [ 1010 ]。
長い 長いN、K、X2、Y2。
長い 長い NUM [ 1010 ]、X1 [ 1010 ]、Y1の[ 1010 ]、ANS。
int型のmain(){ 
    IOS :: sync_with_stdio(); 
    CIN >> N >> K。
    以下のためのint型 I = 1;私は= Kを<; I ++)は、CIN >> NUM [I] >> Y1の[I] >> X1 [i]は、
    以下のためにint型 i = 1 ; iは= Kを<; iは++ ){ 
        ANS = 0 
        X2 = NUM [i]の%N。
        もし(NUM [i]は%N == 0)×2 = N。
        Y2 = NUM [I] / N。
        もし(!numは[I]%N = 0)Y2 ++ ;
        INT J = 1、J <I、J ++ ){            
             場合(X [J] .now == Y2){ 
                X2 =(X [J] .move + X2)%N。
                もし(×2 == 0)×2 = N。
            } 
            であれば(Y [J] .now ==のX2){ 
                Y2 =(Y [J] .move + Y2)%N。
                もし(Y2 == 0)Y2 = N。
            } 
        } 
        もし(X1 [i]が< X2){ 
            ANS + = N-X2 + X1 [i]は、
            X [i]は.move = N-X2 + X1 [i]は、
            X [i]は.now = Y2。
        } 
        そう であれば(X1 [i]が> X2){ 
            ANS + = X1 [I] - X2。
            X [i]は.move = X1 [I] -X2; 
            X [i]は.now = Y2。
        }         
        もし(Y1 [I] < Y2){ 
            ANS + = N-Y2 +のY1の[I]。
            Y [i]は.move = N-Y2 + Y1 [I]。
            [I] .now Y =(X 2 + X [i]は.move)%N。
            もし(Y [i]が.now == 0)Y [i]は.now = N。
        } 
        そう であれば(Y1 [I]> Y2){ 
            ANS + = Y1 [I] - Y2。
            Y [i]は.move = Y1 [I] - Y2。
            [I] .now Y =(X 2 + X [i]は.move)%N。
            もし(Y [i]が.now == 0)Y [i]は.now = N。
        } 
        COUT << ANS << ENDL。
    } 
}

 

  

読んでくれてありがとう。

 

おすすめ

転載: www.cnblogs.com/tianbowen/p/11305317.html