問題描述
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。
每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。
如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2(即不高興程度為3),依次類推。當要求某個小朋友第k次交換時,他的不高興程度增加k。
請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。
如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。
輸入格式
輸入的第一行包含乙個整數n,表示小朋友的個數。
第二行包含 n 個整數 h1 h2 … hn,分別表示每個小朋友的身高。
輸出格式
輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。
樣例輸入3
3 2 1
樣例輸出
9樣例說明
首先交換身高為3和2的小朋友,再交換身高為3和1的小朋友,再交換身高為2和1的小朋友,每個小朋友的不高興程度都是3,總和為9。
資料規模和約定
對於10%的資料, 1<=n<=10;
對於30%的資料, 1<=n<=1000;
對於50%的資料, 1<=n<=10000;
對於100%的資料,1<=n<=100000,0<=hi<=1000000。
解析:一道用樹狀陣列求逆序對的題目,複習了之前學習的樹狀陣列。
#include #include #include #include #define maxn 1000005
#define n 100050
using namespace std;
long long a[n],b[maxn];
long long c[maxn];
int lowbit(int x)
int getsum(int x)
void add(int x,int y)
}int main()
memset(c,0,sizeof(c));
for(int i=n;i>=1;i--)
long long ant=0;
for(int i=1;i<=n;i++)
cout
}
藍橋杯歷屆試題 小朋友排隊(樹狀陣列,逆序對)
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...
acwing 藍橋杯 小朋友排隊 (樹狀陣列)
題目鏈結 初始時,對於小朋友i來說,前面比他高的人數加上後面比他矮的人數就是這個小朋友將要交換的次數。利用樹狀陣列,第一遍求前面比他高的人數 第二遍求後面比他矮的人數 include using namespace std const int n 1e6 9 int tr n h n typedef...
藍橋 小朋友排隊 樹狀陣列
思路 樹狀陣列處理逆序對 求前面有多少個數比當前這個大 正著插 求後面有多少個數比當前這個小 反著插 求出f陣列和b陣列即可 下面是ac include include include include include include include define ll long long defin...