NOIP2015模擬11 5 旅行

2021-10-08 21:36:29 字數 1685 閱讀 6420

經過觀察,可以發現題目有乙個比較不錯的性質:

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...