今晚ABC F写挂了,求调悬关
  • 板块题目总版
  • 楼主WaTleZero_pt
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/7/26 22:54
  • 上次更新2025/7/27 16:00:04
查看原帖
今晚ABC F写挂了,求调悬关
536745
WaTleZero_pt楼主2025/7/26 22:54

蒟蒻对着看了30min都不知道哪里错了,样例全对,自己造的数据也没问题

#include<bits/stdc++.h>
using namespace std;
template<class T>
void in(T &x){
	char c=getchar();T f=1; x=0;
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	x*=f;
}
const int N=200010;
typedef long long ll;
vector<int> g[N];
int n,k,a[N],u,v;
ll f[N][6][3];
void dfs(int u,int fa){
	int c=0;
	f[u][0][0]=0;
	for(int v:g[u]){
		if(v!=fa){
			dfs(v,u);
			c++;
			for(int j=5;j>=0;j--)
				for(int k=j;k>=0;k--)
					for(int l=2;l>=0;l--){
						int tmp=f[u][k][l]; 
						f[u][j][l]=max(f[u][j][l],tmp+f[v][j-k][0]);
						if(l<=1)f[u][j][l+1]=max(f[u][j][l+1],tmp+f[v][j-k][1]);
//						printf("%d %d %d:%lld\n",u,j,l+1,f[u][j][l+1]);
					}
		}
	}
//	printf("%d:\n",u);
	for(int j=5;j>=0;j--){
//		printf("%d\n",f[u][j][2]);
		ll tmp=j?f[u][j-1][1]+a[u]:0;
		f[u][j][1]=max(f[u][j][1]+a[u],f[u][j][0]+a[u]);
		f[u][j][0]=max(tmp,f[u][j][0]); 
		if(j) f[u][j][0]=max(f[u][j][0],f[u][j-1][2]+a[u]);
//		printf("%d %d\n",f[u][j][0],f[u][j][1]); 
	}
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	in(n); in(k);
	for(int i=1;i<=n;i++) in(a[i]);
	for(int i=1;i<n;i++){
		in(u); in(v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	memset(f,0xc0,sizeof(f));
	dfs(1,0);
	printf("%lld",f[1][k][0]);
	return 0;
}
2025/7/26 22:54
加载中...