[題目鏈結]
[演算法]
首先將式子化簡 :
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)
[**]
#includeusingnamespace
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 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...