bzoj1063 Noi2008 道路設計

2022-08-13 10:45:14 字數 1287 閱讀 1805

樹形dp。

這道題的劃分方式和樹鏈剖分類似,但是重路徑能經過根節點,而且要求方案數,所以不能用樹鏈剖分。

但是由這種關係可以知道答案很小為log n級別(翻看資料後,確認了答案最大為4。。但應該有能使答案更大的資料)

用f[i][j][0/1/2]分別表示,以i為子樹的節點中,不便利值最大的點不便利值為j。

0代表i節點不在任何一條兒子構成的鏈中,1表示在一條和兒子構成的鏈中,2代表2條兒子構成的鏈經過了i節點。

(這個很難說明白的感覺。。)

他們之間的遞推關係。。。然後我不會在這個框下面打字了,就在上面解釋。

f1計算出了v[i]能和根節點鏈結的方案數。f2代表了所有不和根節點連線的方案數。

f1=f[v[i]][j][0]+f[v[i]][j][1

]f2=(j==0?0:(f[v[i]][j-1][0]+f[v[i]][j-1][1]+f[v[i]][j-1][2

]));

f[u][j][

2]=f[u][j][1]*f1+f[u][j][2]*f2;

f[u][j][

1]=f[u][j][0]*f1+f[u][j][1]*f2;

f[u][j][

0]=f[u][j][0]*f2;

#include#include

#include

#define ll long long

using

namespace

std;

const

int maxn = 200000 + 10

;const

int maxh = 12

;int

g[maxn],v[maxn],next[maxn],eid;

long

long f1,f2,f[maxn][maxh][3

],res,mod;

intn,m,ans;

void addedge(int a,int

b) ll update(ll x)

void dfs(int u,int

fa)

}}int

main()

for(int i=1,u,v;i)

for(int i=1;i<=n;i++)

for(int j=0;j)

f[i][j][

0]=1

;

dfs(

1,0);

for(int i=0,res;i)

}return0;

}

bzoj1063 NOI2008 道路設計

time limit 20 sec memory limit 162 mb submit 931 solved 509 submit status discuss description z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一 些城市之間...

BZOJ1063 NOI2008 道路設計

傳送門 sol 這東西怎麼長了一臉樹鏈剖分的樣子 把公路視為輕邊 發現輕邊的數量是log級別的?dp i j k 表示在節點i,答案為j,這個點向下連 0,1,2 條邊的方案數 直接轉移即可 include using namespace std long long dp 100005 20 4 p...

bzoj1063 Noi2008 道路設計

z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一些城市之間由雙向的公路所連線。非常神奇的是z國的每個城市所處的經度都不相同,並且最多隻和乙個位於它東邊的城市直接通過公路相連。z國的首都是z國政治經濟文化旅遊的中心,每天都有成千上萬的人從z國的其他城...