タイトル説明
インタラクション。各時間は、クエリが配置され、配置位置の同じ数が、回答を得るように配置されているこのような構成に回答を返すことができます。
データ範囲
$ N \ 5 \回10 ^ 3;クエリ\ 5 \回10 ^ 4 $
問題の解決策
間違った行を最初に見つけ考えてみましょう、そして、答えは置換数の形でリングのような形をします。したがって、我々の目標は、$ \ FRAC {(N-1)\ n倍} {2} $側部は、物品は、$ $ n側が有効な選択されています。
有効な側の性質を考慮して、すなわち、交換機側有効な数値エンドポイント問い合わせ結果は増加します。したがって、各エッジ$(i、j)は$(I + J)\%N $パケットで考慮$、のために、各側の各端にある2つが互いに異なる、我々は、パーティションと同様の方法を使用することができます有効であると判断された側、最終的な向きとすることができます。
コード
#include 「game.h 」 使用して 名前空間はstdを、 const int型 N = 5005 ; 構造体 O { int型のX、Y;}; ベクター <O> P [N]、H。 ベクター < INT > F [N]、。 INT G [N << 2 ]、S [N]、CNT、LST、D [N]。 BOOL VIS [N]。 BOOL J(INT U){ 戻り D [U] < 2 ;} ボイド追加(INT U、INT V){D [U] ++ ; F [U] .push_back(V);} ボイド検索(int型 K、int型 I、int型の L、int型r)を{ 場合(L == r)は{ P [I] [L] .X、P [I] [L] .Y)(追加します。 追加(P [I] [L]・Y、P [I] [L] .X)。 リターン; } INT Lsは=(K << 1)、ルピー=(LS | 1)、ミッド=(L + R)>> 1 。 用(INT ; J <=中間、J = L J ++ ) スワップ([P [I] [J] .X]、[P [I] [J] .Y])。 G [Lsは] =カウント(); G [ルピー] = G [K] - G [Lsの]。 用(INT ; J <=中間、J = L J ++ ) スワップ([P [I] [J] .X]、[P [I] [J] .Y])。 もし(G [Lsと])(LS、I、L、MID)を見つけます。 もし(RS、I、中間+見つける(G [ルピー])1 、R) } ボイド DFS(INT U){ VIS [U] = 1 ; S [++ CNT] = U。 INT Z = F [U] .size()。 以下のために(INT iが= 0 ; I <Z; I ++ ) 場合には(!{VIS [F [U] [I]) スワップ([U]、[F [U] [I])。 DFS(F [U] [I])。 } } ベクトル < INT >推測(整数 nは、INT 限界){ srand関数(233); a.resize(N) 以下のために(INT iが= 1 ; I <= N; I ++)[I- 1 ] = Iと、 場合(N == 1)を返します。 一方、(COUNT()) random_shuffle(a.begin()、a.end())。 以下のために(INT iは= 0、I <N; I ++ ) のための(INT J = I + 1、J <N; J ++ ) P [(I + J)%のN] .push_back((O){I、J})。 以下のために(INT Z、iは= 0 ; N I <; iは++ ){ Z= P [I] .size()。もし(!z)を続ける; h.clear(); 用(INT J = 0 ; J <Z、J ++ ) 場合(J(P [I] [J] .X)&& J(P [I] [J] .Y)) h.push_back(P [I] [ J]); P [I] = H; Z = P [I] .size()。もし(!z)は継続。 用(INT J = 0 ; J <Z、J ++ ) スワップ([P [I] [J] .X]、[P [I] [J] .Y])。 G [ 1 ] = カウント()。 用(INT J = 0 ; J <Z、J ++) スワップ([P [I] [J] .X]、[P [I] [J] .Y])。 もし(G [ 1 ])を求める(1、I、0、Z- 1 )。 } のための(INT iは= 0 ; I <N I ++、V ) であれば(!VIS [I]){ CNT = 0 ; DFS(I); V = カウント()。 もし(V == LST){ ため(INT J = CNT- 1 ; J; j-- ) スワップ([S [j + 1 ]、[S [J]); スワップ([S [1 ]、[S [CNT])。 用(INT J = CNT- 1、J> 1 ; j-- ) スワップ([S [j + 1 ]、[S [J]); } LST + = CNT。 } を返します。 }