藍橋杯 演算法訓練 逆序對

2021-10-04 13:17:22 字數 2004 閱讀 5417

資源限制

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

問題描述

alice是乙個讓人非常愉躍的人!他總是去學習一些他不懂的問題,然後再想出許多稀奇古怪的題目。這幾天,alice又沉浸在逆序對的快樂當中,他已近學會了如何求逆序對對數,動態維護逆序對對數等等題目,他認為把這些題讓你做簡直是太沒追求了,於是,經過一天的思考和完善,alice終於拿出了一道他認為差不多的題目:

有一顆2n-1個節點的二叉樹,它有恰好n個葉子節點,每個節點上寫了乙個整數。如果將這棵樹的所有葉子節點上的數從左到右寫下來,便得到乙個序列a[1]…a[n]。現在想讓這個序列中的逆序對數量最少,但唯一的操作就是選樹上乙個非葉子節點,將它的左右兩顆子樹交換。他可以做任意多次這個操作。求在最優方案下,該序列的逆序對數最少有多少。

alice自己已近想出了題目的正解,他打算拿來和你分享,他要求你在最短的時間內完成。

輸入格式

第一行乙個整數n。

下面每行,乙個數x。

如果x=0,表示這個節點非葉子節點,遞迴地向下讀入其左孩子和右孩子的資訊,如果x≠0,表示這個節點是葉子節點,權值為x。

輸出格式

輸出乙個整數,表示最少有多少逆序對。

樣例輸入30

0312

樣例輸出

1資料規模與約定

對於20%的資料,n <= 5000。

對於100%的資料,1 <= n <= 200000,0 <= a[i]<2^31。

#include

#define n 200010

//定義總的節點個數

long

long ans =0;

//儲存調整前後最小的逆序對數

int n,val,index=1;

//n有效節點數,index為有效節點下標,val臨時輸入的值

//s儲存的是以i為根節點的有效節點數目,left為i的左子樹,right為i的右子樹,key表示i的鍵值

int s[n]

,left[n]

,right[n]

,key[n]

;int

rrotate

(int t)

intlrotate

(int t)

intadjust

(int t,

int flag)

return

rrotate

(t);}}

else

return

lrotate

(t);}}

return t;

//如果都不滿足,直接返回其原先節點

}int

insert

(int t,

int node)

else

}else

else

}return

adjust

(t,key[node]

//插入節點後要對平衡二叉樹進行調整

}int

rank

(int t,

int val)

else

}int

merge

(int node,

int begin,

int end)

ans +

= lens < rans ? lens : rans;

//ans儲存較小的逆序對數

for(i=begin;i)return node;

}int

buildtree()

int a = index;

int lt =

buildtree()

;//遞迴建立左子樹

int b = index;

int rt =

buildtree()

;//遞迴建立右子樹

int c = index;

if(b - a > c - b)

else

}int

main()

藍橋杯 演算法訓練 Lift and Throw

演算法訓練 lift and throw 時間限制 3.0s 記憶體限制 256.0mb 問題描述 給定一條標有整點 1,2,3,的射線.定義兩個點之間的距離為其下標之差的絕對值.laharl,etna,flonne一開始在這條射線上不同的三個點,他們希望其中某個人能夠到達下標最大的點.每個角色只能...

藍橋杯 演算法訓練 數列

題目 演算法訓練 數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 3 0,31,3 0 31,3 2,...

藍橋杯 演算法訓練 Glenbow Museum

資料規模和約定 按題目描述所示。問題描述 卡城著名的格林堡博物館是加拿大西部最大的博物館,展品涵蓋了藝術 文化史以及礦物學。如今乙個全新的展區正在被布置,它是專門為你這樣傑出的程式猿 媛 打造的。不幸的是,由於空間不足,博物館打算建造一棟新的建築來重新安置這個展區。新的建築的尺寸和容量將不同於原始的...