NOIP2013 火柴排隊

2022-05-05 00:48:08 字數 1218 閱讀 7770

[題目鏈結]

[演算法]

首先將式子化簡 :

sigma( (ai - bi) ^ 2) = sigma( ai^2 + bi^2 - 2aibi ) 

顯然 , 只需最大化aibi就能最小化「距離」

考慮貪心 , 將a中最小元素與b中最小元素組合 , a中第二小與b中第二小組合 ... , 不難證明這樣是最優的 ,

因為 : 設a < b , c < d , 將a與c組合 , b與d組合比a與d組合 , b與c組合更優。

不妨先將a和b公升序排序 ,記錄每個元素的初始位置 , 構造新序列p, 令p[a[i].id] = b[i].id , 問題就轉化為了 , 每次可以交換相鄰兩個元素 , 要求用最少的次數時p按公升序排列。

只需求出逆序對數即可。 可以用歸併排序或樹狀陣列實現 , 筆者使用的是樹狀陣列

時間複雜度 :o(nlogn)

[**]

#includeusing

namespace

std;

#define maxn 100010

const

int p = 99999997

;struct

info

a[maxn],b[maxn];

intn,ans;

intc[maxn];

template

inline void read(t &x)

struct

binary_indexed_tree

inline

void modify(int pos,int

val)

inline

int query(int

pos)

} bit;

inline

bool cmp(info a,info b)

intmain()

for (int i = 1; i <= n; i++)

sort(a + 1,a + n + 1

,cmp);

sort(b + 1,b + n + 1

,cmp);

for (int i = 1; i <= n; i++) c[a[i].id] =b[i].id;

for (int i = 1; i <= n; i++)

printf(

"%d\n

",ans);

return0;

}

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...

NOIP 2013 火柴排隊

題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可...

noip2013 火柴排隊

涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...