トピックリンクします。https://vjudge.net/problem/POJ-2299
質問の意味:シーケンスを考えると、あなたは2つのだけの隣接する要素を入れ替えることができ、かつ昇順に順序を交換するために何度も尋ねました。
アイデア:基本的に右逆求めています。私たちは、マージソートを逆にしようと、これは簡単なCDQパーティションです。
#include <cstdioを> する#include <アルゴリズム> の#include <cstdlib> の#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 const int型 MAXN = 5E5 + 5 。 整数nは、[MAXN]、TMP [MAXN]。 ANS LL; ボイド merge_sort(int型 L、INT R){ 場合(L == R)のリターン; INT半ば=(L + R)>> 1 。 INT T1 = 1、T2 =ミッド+ 1、CNT = L。 merge_sort(L、MID)。 merge_sort(ミッド + 1、R)。 一方、(T1 <=ミッド||さt2 <= R){ 場合(T2> R ||(T1 <=ミッド&& [T1] <= [T2])) TMP [CNTが ++] [T1を++ = ]。 他{ ANS + =(MID-T1 + 1 )。 TMP [CNTは ++] [T2 ++ = ]。 } } のための(int型 ; I <= R ++ iはLを= i)は [I] = [I] TMPを、 } int型のmain(){ 一方(scanf関数(" %のD "、&n)は、N){ ANS = 0 ; のため(int型 I = 1 ; ++; iが<= N I) のscanf(" %dの"、および[I])。 merge_sort(1 、N) printf(" %LLDする\ n " 、ANS)。 } 戻り 0 。 }