$説明$
各時系列は、$ \和(a_iを-b_i)^ 2 $が最小交換の隣接する二つの最小必要数の数を交換することができる$二つの配列B、等しい長さ$ aを与えられました。
$ソル$
シーケンスは、私が多数に対応して$ $のシーケンスの最初の$ I $と$ B $の$多数を$後にスワップは、特定の順序を満たしています。言わなかった、非常に明らかに証明し、ロスの里の説明は、いくつかの与えられました離散的な2つの配列のペアは、その後数、変換$ Bの多数の$ Iの$配列を位置決めする$ $の多数の$する$ I $の配列。その後に形質転換質問、$ $になることができますどのように多くの回数の$ B $の交換シーケンス、および個別の$ $シーケンスは、単一の増加であるため、実際には、$ 1,2,3 ...、N $。そう、これはのみ必要ですとき$ bは$シーケンスは、ツリーの配列をソートまたはマージするために使用することができる好きに逆転します。
$コード$
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include <アルゴリズム> に#define ILインライン の#define Rgを登録し ます。#define行く(I、A、B)は(RG int型I = A ; iが<= Bと、++ I) の#defineはい(I、B)のための(RG INT iは=; I> = B; - I) の#define MEM(B)のmemset(B 、はsizeof(A)) の#defineっ長い長 の#define DB二重 の#define INF 2147483647 使用 名前空間STDを、 ILのINTのリード() { たRG INT X = 0、Y =1 ; チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} 戻りのx *のY。 } のconst int型 N = 100010、99999997 ; int型N、C [N]、D [N]、E [N]。 LL として; 構造体ノード{ INT W、POS、DX;} [N]、B [N]。 IL BOOL CMP1(ノードX、ノードY){ 戻り XW < YW;} IL ブール CMP2(ノードX、ノードY){ 戻り x.posを< y.pos;} IL ボイドLSH() { ソート(A + 1、 + N + 1 、CMP1)。 ソート(B + 1、B + N + 1 、CMP1)。 行く(iは1、N)Cは[I] = [I] .POSと、 行く(I、1、n)がB [i]は.dx = I。 ソート(B + 1、B + N + 1 、CMP2)。 行く(I、1、N)のD [i]は=のC [B [i]は.dx]。 } IL ボイド GB(int型 L、INT R) { 場合(L == R)のリターン; RG INT半ば=(L + R)>> 1、I = 1、J =ミッド+ 1 。 GB(L、MID)、GB(MID + 1 、R)。 (K、L、R)に行く { もし、((D [i]が> D [j]が&& J <= R)|| I> MID)として =(として(MID-I + + 1))%のMOD、E [K] = D [J ++ ]。 他の E [K] = dは[私は++ ]; } (K、L、R)D [k]を行く = E [k]を、 } int型のmain() { N = )(読み取ります。 行く(I、1、N)[i]は.W =リード()、[i]は.POS = I。 行く(I、1、n)がB [i]は.W(リード。=)、B [i]は.POS = I。 LSH(); GB(1 、N) printf(" %LLDする\ n "、など)。 リターン 0 ; }