我々は、データの範囲を見ての質問は、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。 } }
読んでくれてありがとう。