河南的题那么强QAQ
D1T1:
简单的树形Dp。
对于当前的一个节点Now,我们先枚举它的儿子节点,再通过size[Now]*size[Son]的复杂度更新F[Now];
for(int i=1;i<=K;i++) G[Now][i]=F[Now][i];
for(int i=min(size[Now],K);i>=0;i--)
for(int j=0;j<=min(min(i,K),size[bian[u].to]);j++)
{
long long Ans=0;
Ans=F[Now][i-j]+F[bian[u].to][j];
Ans+=(long long)(j*(K-j))*(long long)(bian[u].len);
Ans+=(long long)((size[bian[u].to]-j)*(N-size[bian[u].to]-K+j))*(long long)(bian[u].len);
G[Now][i]=max(G[Now][i],Ans);
}
for(int i=1;i<=K;i++) F[Now][i]=G[Now][i];
必须把G提出来计算,不然可能有问题。
D1T2:
树链剖分,裸爆了好不好。
last[x]表示以x为根的子树中编号最大的点的编号。
线段树就可以了。
D2T1:
我们设A[x]表示到了x这个状态及其子集可能被选中的概率。
那么最后答案就是 Sigma(Miu[x]/(1-A[x]))。
证明见bzoj4036
D1T1:
简单的树形Dp。
对于当前的一个节点Now,我们先枚举它的儿子节点,再通过size[Now]*size[Son]的复杂度更新F[Now];
for(int i=1;i<=K;i++) G[Now][i]=F[Now][i];
for(int i=min(size[Now],K);i>=0;i--)
for(int j=0;j<=min(min(i,K),size[bian[u].to]);j++)
{
long long Ans=0;
Ans=F[Now][i-j]+F[bian[u].to][j];
Ans+=(long long)(j*(K-j))*(long long)(bian[u].len);
Ans+=(long long)((size[bian[u].to]-j)*(N-size[bian[u].to]-K+j))*(long long)(bian[u].len);
G[Now][i]=max(G[Now][i],Ans);
}
for(int i=1;i<=K;i++) F[Now][i]=G[Now][i];
必须把G提出来计算,不然可能有问题。
D1T2:
树链剖分,裸爆了好不好。
last[x]表示以x为根的子树中编号最大的点的编号。
线段树就可以了。
D2T1:
我们设A[x]表示到了x这个状态及其子集可能被选中的概率。
那么最后答案就是 Sigma(Miu[x]/(1-A[x]))。
证明见bzoj4036