poj2299(マージソートするリクエストをリバース)

トピックリンクします。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 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11415341.html