\(n\) 個小朋友站成一排。
現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。
每個小朋友都有乙個不高興的程度。
開始的時候,所有小朋友的不高興程度都是 \(0\)。
如果某個小朋友第一次被要求交換,則他的不高興程度增加 \(1\),如果第二次要求他交換,則他的不高興程度增加 \(2\)(即不高興程度為 \(3\)),依次類推。當要求某個小朋友第 \(k\) 次交換時,他的不高興程度增加 \(k\)。
請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。
如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。
輸入的第一行包含乙個整數 \(n\),表示小朋友的個數。
第二行包含 \(n\) 個整數 \(h_1,h_2,…,h_n\),分別表示每個小朋友的身高。
輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。
資料範圍
\(1≤n≤100000,\)
\(0≤h_i≤1000000\)
輸入樣例:
3
3 2 1
輸出樣例:9
樣例解釋
首先交換身高為\(3\)和\(2\)的小朋友,再交換身高為\(3\)和\(1\)的小朋友,再交換身高為\(2\)和\(1\)的小朋友,每個小朋友的不高興程度都是\(3\),總和為\(9\)。
貪心,逆序對,樹狀陣列假設序列逆序對數量為 \(k\),首先基於氣泡排序的思想,要交換的次數僅為 \(k\),然後分析每個數,假設前面比它大的數有 \(k_1\) 個,後面比它小的數有 \(k_2\) 個,即最後會有 \(k_1+k_2\) 個數從當前數穿過,也即當前數至少要被交換 \(k_1+k_2\) 次,將這些數全部加起來恰好等於 \(2k\),由於有重複計算,逆序對個數恰好為 \(k\),即每個數可以交換 \(k_1+k_2\) 次,使其完成排序且最少
// problem: 小朋友排隊
// contest: acwing
// url:
// memory limit: 64 mb
// time limit: 1000 ms
// // powered by cp editor (
// %%%skyqwq
#include //#define int long long
#define help
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef pairpii;
template bool chkmax(t &x, t y)
template bool chkmin(t &x, t y)
template void inline read(t &x)
while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
x *= f;
}const int n=1e6+5;
int res[n],tr[n],n,h[n];
int ask(int x)
void add(int x,int y)
memset(tr,0,sizeof tr);
for(int i=n;i;i--)
ll ans=0;
for(int i=1;i<=n;i++)ans+=1ll*(1+res[i])*res[i]/2;
cout
}
AcWing 1215 小朋友排隊
原題鏈結 考察 樹狀陣列 貪心 or歸併排序 貪心 思路 首先乙個定理 氣泡排序的交換次數 逆序對個數.證明 氣泡排序每次交換減少乙個逆序對,當最後逆序對數量 0,交換次數 k.又因為每次只能減少乙個.那麼必然可以取到k.對於某乙個人i而言,i前面 hi有k個,後面i有t個.k t就是i的交換次數最...
小朋友排隊
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...
小朋友排隊
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...