WA了10、11两个点,求调
查看原帖
WA了10、11两个点,求调
925129
lzdll楼主2025/7/30 22:24

AT的cf又炸了

#include<bits/stdc++.h>
#define int long long
#define R(x) x=read()
using namespace std;
inline int read() {
	int x=0,y=1;
	char e=getchar();
	while(e<'0'||e>'9') {
		if(e=='-')y=-1;
		e=getchar();
	}
	while(e>='0'&&e<='9') {
		x=(x<<1)+(x<<3)+(e^'0');
		e=getchar();
	}
	return x*y;
}
const int N=200005;
int n,k;
vector<int>G[N];
int a[N];
int f[N][10][3],g[10][3];
int ans[N][10];
/*
dp[0/1/2][j][u]: u subtree,use i lines ,and

0: point u is not used

1: point u is used as an endpoint

2: point u is used as a middle point

*/
void dfs(int u,int fa) {
	f[u][1][1]=a[u];
	f[u][0][0]=0;
	for(int v:G[u]) {
		if(v==fa)continue;
		dfs(v,u);
		for(int i=0; i<=k; ++i) g[i][0]=g[i][1]=g[i][2]=-0x3f3f3f3f3f3f;
		for(int i=0; i<=k; ++i) {
			for(int j=0; i+j-1<=k; ++j) {
				if(i+j-1<=k&&i+j-1>=0) g[i+j-1][2]=max(g[i+j-1][2],f[u][i][1]+f[v][j][1]);
				if(i+j>k)continue;
				g[i+j][0]=max(g[i+j][0],f[u][i][0]+ans[v][j]);
				g[i+j][1]=max(max(g[i+j][1],f[u][i][1]+ans[v][j]),f[u][i][0]+f[v][j][1]+a[u]);
				g[i+j][2]=max(g[i+j][2],f[u][i][2]+ans[v][j]);
			}
		}
		for(int i=0; i<=k; ++i) {
			for(int j=0; j<=2; ++j) {
				f[u][i][j]=max(g[i][j],f[u][i][j]);
				ans[u][i]=max(f[u][i][j],ans[u][i]);
			}
		}
	}

}
signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	memset(f,0xc0,sizeof f);
	memset(ans,0xc0,sizeof ans);
	R(n),R(k);
	for(int i=1; i<=n; ++i) {
		R(a[i]);
	}
	for(int i=1; i<n; ++i) {
		int R(x),R(y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dfs(1,0);
	int res=0;
	for(int i=0;i<=k;++i){
		res=max(res,ans[1][i]);
	}cout<<res<<"\n";
//	cout<<ans[1][k];
	return 0;
}

2025/7/30 22:24
加载中...