你準備給弟弟 ike 買一件禮物,但是,ike 挑選禮物的方式很特別:他只喜歡那些能被他排成有序形狀的東西。
你準備給 ike 買乙個風鈴。風鈴是一種多層的裝飾品,一般掛在天花板上。
每個風鈴都包含一些由豎直線連起來的水平杆。每根杆的兩頭都有線連線,下面或者掛著另一根水平杆,或者掛著乙個玩具。下面是乙個風鈴的例子:
為了滿足弟弟,你需要選乙個滿足下面兩個條件的風鈴:
(1) 所有的玩具都在同一層(也就是說,每個玩具到天花板之間的杆的個數是一樣的)或至多相差一層。
(2) 對於兩個相差一層的玩具,左邊的玩具比右邊的玩具要更靠下一點。
第二步,也是最後一步,將杆 2 的左右兩邊交換,這使得杆 4 到了左邊,原來在左邊的玩具到了右邊,交換的結果發下圖所示:
現在的這個風鈴就滿足 ike 的條件了。
你的任務是:給定乙個風鈴的描述,求出最少需要多少次交換才能使這風鈴滿足 ike 的條件(如果可能)
輸入的第一行包含乙個整數 n(1≤n≤100 000),表示風鈴中有多少根桿。
接下來的 n 行描述杆的連線資訊。這部分的第 i 行包含兩個由空格分隔的整數 li和 ri,描述杆 i 的左右兩邊懸掛的東西。如果掛的是乙個玩具,則對應的值為-1,否則為掛在下面的杆的編號
輸出僅包含乙個整數。表示最少需要多少次交換能使風鈴滿足 ike 的條件。如果不可能滿足,輸出-1。
62 3
-1 4
5 6-1 -1
-1 -1
-1 -1
才不會說我是看這個題目好玩才去做的呢
這個題目讓我想起了林清玄的散文《風鈴》:
有了風鈴,風雖然吹過了,還留下美妙的聲音等等,跑題了!有了心的風鈴,生命即使走過了,也會留下動人的痕跡
每一次起風的時候,每一步歲月的腳步,都會那樣真實地存在。
這個題就是樹形dp嘛,注意判斷幾種不行的情況:
1.風鈴相差層數》1
2.在滿足風鈴相差層數為1的情況下,把在上面一層的風鈴統稱為f,把下面一層的風鈴統稱為g
在某一節點,其兩個子節點中都既有f又有g
然後注意各種細節就好了(自古樹形dp細節多qwq)
#include#include#includeusing namespace std;
const int n = 100005;
int ch[n][2],pa[n],dep[n];
int n,rt;
int m,d[n],t;
void get_dep(int u)
else d[m++]=dep[u]+1,t=max(t,d[m-1]);
}}int sz[n],num[n]; //num表示該節點子樹中f與g的總和,sz表示該節點子樹中f個數
void dfs0(int u)
else
}}int flag;
int dfs(int u)
if(ch[u][0]==-1 && ch[u][1]!=-1)
if(ch[u][0]!=-1 && ch[u][1]==-1)
return 0;
}int main()
for(int i=1;i<=n;i++) if(!pa[i])
dep[rt]=1; get_dep(rt);
flag=1;
for(int i=0;i
if(flag==0)
dfs0(rt);
if(sz[rt]==0)
int ans=dfs(rt);
if(flag==0) printf("-1");
else printf("%d",ans);
return 0;
}
洛谷 P3621 APIO2007 風鈴 思維
傳送門 給出一棵樹,要求我們通過最少的交換子樹的次數使得一棵樹的最小深度和最大深度差不大於1 11,且左子樹的深度要大於右子樹的 我們在樹上跑一次dfs dfsdf s,求出最大深度和最小深度 如果差大於1 11顯然無解 現在我們來考慮哪些情況是必然需要交換的,設1 11表示所有子樹的深度較大,2 ...
洛谷 P2007 魔方
常神牛從來沒接觸過魔方,所以他要借助計算機來玩。即使是這樣,他還是很菜。常神牛家的魔方都是3 3 3的三階魔方,大家都見過。更正 3 4以圖為準。作為一名菜鳥,常神牛從網上搜了一篇攻略,並找人翻譯成了他自己會做的方法。現在告訴你他的魔方情況,以及他從網上搜到的攻略,請你求出最後魔方變成什麼樣子。輸入...
洛谷 P3629 APIO2010 巡邏
題目在這裡 這是乙個紫題,當然很難。我們往簡單的想,不建立新的道路時,從1號節點出發,把整棵樹上的每條邊遍歷至少一次,再回到1號節點,會恰好經過每條邊兩次,路線總長度為 2 n 1 根據樹的深度優先遍歷思想,很容易證明這個結論,因為每條邊必然被遞迴一次,回溯一次。建立1條新道路之後,因為新道路必須恰...