藍橋杯 歷屆試題 小朋友排隊 線段樹實現

2021-10-23 06:02:12 字數 2721 閱讀 4734

[藍橋杯][歷屆試題]小朋友排隊

時間限制: 1sec 記憶體限制: 128mb 提交: 1507 解決: 242

題目描述

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

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

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

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

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

樣例說明

首先交換身高為3和2的小朋友,再交換身高為3和1的小朋友,再交換身高為2和1的小朋友,每個小朋友的不高興程度都是3,總和為9。

資料規模和約定

對於100%的資料,1< =n< =100000,0< =hi< =1000000。

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

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

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

樣例輸入

33 2 1

樣例輸出

9說明:此題利用樹狀陣列不管是從時間還是空間以及**複雜度都比線段樹好一些,用線段樹解此題是更好的練習不同的情況。。。

注意:線段樹處理問題時一般要開闢處理資料4倍以上的空間,因此若直接以樹狀陣列那樣以身高作為表示的區間的下標那必定空間超限,因此我們需要對身高進行離散化處理,這是線段樹題目中常用的操作,將身高值轉化為身高排名值,這樣就限定在了4*最大人數的空間裡解決問題。除此之外,都是常用的線段樹操作

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

int t1[

100005*4

];int a[

100005];

ll f[

100005];

int b[

100005];

//線段樹記憶體要超限,所以需要離散化處理

struct nodevalue[

100005];

void

set()}

void

pushup

(int rt)

//rt為結點

//點修改

void

updata

(int l,

int l,

int r,

int rt,ll num)

int mid=

(l+r)/2

;if(l<=mid)

updata

(l,l,mid,rt<<

1,num)

;else

updata

(l,mid+

1,r,

(rt<<1)

+1,num)

;pushup

(rt);}

//查詢操作

intquery

(int l,

int r,

int l,

int r,

int rt)

int mid=

(l+r)

>>1;

int ans=0;

if(l<=mid) ans+

=query

(l,r,l,mid,rt<<1)

;if(r>mid) ans+

=query

(l,r,mid+

1,r,

(rt<<1)

+1);

return ans;

}bool

cmp(node n1,node n2)

bool

cmp2

(node n1,node n2)

int n;

intmain()

sort

(value+

1,value+

1+n,cmp)

;//先用身高進行排名

int cnt=1;

b[1]=cnt;

//離散化處理

for(

int i=

2;i<=n;i++

)for

(int i=

1;i<=n;i++

)int maxn=b[n]

;//最大的身高排名值

sort

(value+

1,value+

1+n,cmp2)

;//再用序號將他們還原

maxn++

;for

(int i=

1;i<=n;i++

)memset

(t1,0,

sizeof

(t1));

for(

int i=n;i>=

1;i--

) ll sum=0;

for(

int i=

1;i<=n;i++

) sum+

=f[a[i]];

cout

}

藍橋杯 歷屆試題 小朋友排隊

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

藍橋杯 歷屆試題 小朋友排隊

時間限制 1sec 記憶體限制 128mb 提交 75 解決 11 題目描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增...

藍橋杯 小朋友排隊(線段樹)

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