經過觀察,可以發現題目有乙個比較不錯的性質:
1、一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。
所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a
aa陣列裡,偶數的放進b
bb陣列裡,再給他們分別進行排序。
然後進行兩兩結合,先把a陣列裡的所有數跟b1b_
b1結合,把路徑丟進乙個小根隊裡。每次取出堆頂,假設取出來的是aia_
ai和bjb_
bj,那麼我們就把aia_
ai和bj+
1b_
bj+1
丟進堆裡,第k
kk次取出來的堆頂就是答案。
可是還是有很多童鞋有疑惑:兩個路徑結合,他們可能會有重合的邊呀?
答:但是兩條路徑的深度的奇偶性質並不相同,所以呢兩個路徑重合的部分,第一條路徑是正數,第二條路徑就是負數,反之,第一條路徑是負數,第二條路徑是正數,所以兩兩會抵消掉,這樣我們就不用考慮了。
#include
#include
#include
#include
#define ll long long
using
namespace std;
const
int n=
1e5+5;
int n,m,cnt,tot,tot1=
1,num;
int head[n]
,dep[n]
;ll dis[n]
,heap[n][3
],a[n]
,b[n]
;struct node edge[n<<1]
;void
add(
int x,
int y,ll z)
void
dfs(
int now,
int fa)
}void
swap
(int x,
int y)
voidup(
int x)
void
down
(int x)
}int
main()
b[1]=
0;dep[0]
=-1;
dfs(1,
0);sort
(a+1
,a+1
+tot)
;sort
(b+1
,b+1
+tot1)
;for
(register
int i=
1;i<=tot;i++
) num=tot;
for(
register
int i=
1;i)int x=heap[1]
[1],y=heap[1]
[2];
swap(1
,num)
;--num;
down(1
);if(y+
1<=tot1)
}printf
("%lld"
,heap[1]
[0])
;fclose
(stdin);
fclose
(stdout);
return0;
}
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
NOIP2015模擬11 3 備用鑰匙
你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...
裝飾大樓 NOIP2015模擬11 3
其實和這東西只是扯上邊而已,完全沒有考演算法 切入正題 際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為hi,那麼必須滿足h...