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