bzoj3611 大工程 虛樹 dp

2021-07-05 15:53:12 字數 1918 閱讀 7298

國家有乙個大工程,要給乙個非常大的交通網路裡建一些新的通道。 

我們這個國家位置非常特殊,可以看成是乙個單位邊權的樹,城市位於頂點上。 

在 2 個國家 a,b 之間建一條新通道需要的代價為樹上 a,b 的最短路徑。

現在國家有很多個計畫,每個計畫都是這樣,我們選中了 k 個點,然後在它們兩兩之間 新建 c(k,2)條 新通道。

現在對於每個計畫,我們想知道:

1.這些新通道的代價和

2.這些新通道中代價最小的是多少 

3.這些新通道中代價最大的是多少

第一行 n 表示點數。

接下來 n-1 行,每行兩個數 a,b 表示 a 和 b 之間有一條邊。

點從 1 開始標號。 接下來一行 q 表示計畫數。

對每個計畫有 2 行,第一行 k 表示這個計畫選中了幾個點。

第二行用空格隔開的 k 個互不相同的數表示選了哪 k 個點。

輸出 q 行,每行三個數分別表示代價和,最小代價,最大代價。 

10 2 1

3 2

4 1

5 2

6 4

7 58 6

9 7

10 9

5 2

5 4

2 10 4

2 5 2

2 6 1

2 6 1

3 3 3

6 6 6

1 1 1

2 2 2

2 2 2

n<=1000000 

q<=50000並且保證所有k之和<=2*n 

題解:顯然先搞出虛樹。然後就是dp的問題了。

這個dp比較麻煩。

我們用g[x]表示在以x為根的子樹中選定了多少個點。

用dis[x]表示在以x為根的子樹中選定點到根的距離和。

用ma[x]表示在以x為根的子樹中選定點到根的最大距離。

用mi[x]表示在以x為根的子樹中選定點到根的最小距離。

用sum,mn,mx分別表示所求的總和,最小值,最大值。 那麼

g[x]+=g[u](u是x的子節點);

dis[x]=dis[x]+dis[u]*b[i].v(u是x的子節點);

sum+=g[u]*(dis[x]+g[x]*b[i].v)+g[x]*dis[u](u是x的子節點);

ma[x]=max(ma[x],ma[u]+b[i].v)(u是x的子節點);

mi[x]=min(mi[x],mi[u]+b[i].v)(u是x的子節點);

mn=min(mn,mi[x]+mi[u]+b[i].v)(u是x的子節點);

mx=max(mx,ma[x]+ma[u]+b[i].v)(u是x的子節點);

然後就好了。

**:#include#include#include#include#define n 1000010

#define inf 99999999

using namespace std;

struct usee[n*2],b[n*2];

int point[n],next[n*2],x,y,cnt,n,q,k,f[n],h[n],d[n],deep[n],fa[n][25],t,s[n];

int point2[n*2],next2[n*2],cnt2,ma[n],mi[n],mx,mn,g[n],top,temp;

long long sum,dis[n];

bool cmp(int a,int b)

if (x!=y) return fa[x][0];else return x;

}void dp(int x)

for (int i=point2[x];i;i=next2[i])point2[x]=0;

}int main(){

scanf("%d",&n);

for (int i=1;i

BZOJ3611 大工程(虛樹,動態規劃)

bzoj 國家有乙個大工程,要給乙個非常大的交通網路裡建一些新的通道。我們這個國家位置非常特殊,可以看成是乙個單位邊權的樹,城市位於頂點上。在 2 個國家 a,b 之間建一條新通道需要的代價為樹上 a,b 的最短路徑。現在國家有很多個計畫,每個計畫都是這樣,我們選中了 k 個點,然後在它們兩兩之間 ...

BZOJ3611 大工程(虛樹,動態規劃)

bzoj 國家有乙個大工程,要給乙個非常大的交通網路裡建一些新的通道。我們這個國家位置非常特殊,可以看成是乙個單位邊權的樹,城市位於頂點上。在 2 個國家 a,b 之間建一條新通道需要的代價為樹上 a,b 的最短路徑。現在國家有很多個計畫,每個計畫都是這樣,我們選中了 k 個點,然後在它們兩兩之間 ...

Luogu P4103大工程(虛樹DP)

題目鏈結 我貌似發現這類dp就是先別管什麼虛樹 把樹形dp搞出來套上虛樹板子就好了 這個樹形dp就是設sum為答案,sumd為子樹內所有點的深度和 當然指的是被詢問的點 maxi指子樹內最深的點的深度,mini同理 然後考慮我們dfs到x,它的兒子已經遍歷到一半,新加進來乙個兒子to 顯然 sum ...