歷屆試題 小朋友排隊 樹狀陣列

2021-08-28 08:12:31 字數 1464 閱讀 4195

歷屆試題 小朋友排隊  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。

每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。

如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2(即不高興程度為3),依次類推。當要求某個小朋友第k次交換時,他的不高興程度增加k。

請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。

如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。

輸入格式

輸入的第一行包含乙個整數n,表示小朋友的個數。

第二行包含 n 個整數 h1 h2 … hn,分別表示每個小朋友的身高。

輸出格式

輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。

樣例輸入

33 2 1

樣例輸出

樣例說明

首先交換身高為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。

這一題主要是求每個人被交換的次數,最後用自然數求和公式即可。

我們可以發現乙個人被交換的次數=前面大於它的人的個數+後面小於它的人的個數。

這樣就轉化為類似於求逆序數了。

模擬插入排序可以過90%,用樹狀陣列可以過100%,注意相等的情況。

#includeusing namespace std;

#define maxn 100005

#define ll long long

int n,t[maxn],c[maxn],dis[maxn];

struct node

p[maxn];

bool cmp(node a,node b)

int lowbit(int i)

void add(int i,int x)

}int sum(int i)

return res;

}int main()

memset(dis,0,sizeof dis);

sort(p+1,p+n+1,cmp);

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

long long ans=0;

memset(c,0,sizeof c);

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

printf("%lld\n",ans);

return 0;

}

歷屆試題 小朋友排隊(樹狀陣列)

試題 歷屆試題 小朋友排隊 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,...

藍橋杯 試題 歷屆試題 小朋友排隊 樹狀陣列

問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...

歷屆試題 小朋友排隊

歷屆試題 小朋友排隊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度...