解題過程:每個小朋友交換次數是前面比他大的個數與後面比他小的個數之和,主要思路是對陣列歸併兩次,分別從左往右、然後再從右往左進行歸併
1.要使用結構體記錄原始資料的位置
2.要開兩個陣列各歸併一遍,如果只開乙個第一次歸併不引用結果會出錯
3.最終結果要開long long,不然結果會爆
4.最終結果要乘以 1ll(1的長整型),不然也會出錯
#include
#include
#include
#include
using namespace std;
struct node
;int cnt[
100005];
void
merge_sort1
(vector
&vc,
int l,
int r)
} t=0;
for(
int k = l;k
) vc[k]
= n[t++];
delete [
]n;}
void
merge_sort2
(vector
&vc,
int l,
int r)
} t=0;
for(
int i=l;i
) vc[i]
= n[t++];
delete [
]n;}
intmain()
vector
uc(vc.
begin()
,vc.
end())
;merge_sort1
(vc,
0,vc.
size()
);merge_sort2
(uc,
0,uc.
size()
);long
long sum =0;
for(
int i=
0;isize()
;i++
) sum +
=1ll*(
1+cnt[i]
)*cnt[i]/2
; cout << sum;
return0;
}
小朋友排隊 藍橋杯
因此我們可以借助樹狀陣列來求解前面比它大的個數,即逆序對 求後面比它小的個數的時候我們可以倒著插入,直接統計即可 因為有的資料為0,所以我們需要將所有插入的資料 1 另外統計的時候要處理相同的數,統計前面的數的時候不用減1,統計後面的數的時候需要減1 這樣處理的原因自己思考一下便出來了 includ...
藍橋杯 小朋友排隊
歷屆試題 小朋友排隊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度...
小朋友排隊 藍橋杯
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...