QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#875739#4815. Flower's LandMirasycleRE 0ms0kbC++142.3kb2025-01-30 11:27:272025-01-30 11:27:27

Judging History

This is the latest submission verdict.

  • [2025-01-30 11:27:27]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2025-01-30 11:27:27]
  • Submitted

answer

#include<bits/stdc++.h>
#define pb emplace_back
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int> > vii;
const int maxn=4e4+10;
void cmax(int &x,int y){ x=x>y?x:y; }
int n,k,a[maxn],sz[maxn],son[maxn];
vi G[maxn],f[maxn],g[maxn]; vii h[2]; 
int ans[maxn],cur[maxn];
void dfs(int u,int fa){//初始化 f 数组 
	for(auto v:G[u]){
		if(v==fa) continue;
		dfs(v,u); sz[u]+=sz[v];
	}
	sz[u]++; f[u].resize(sz[u]+1,0); 
}
void F(int u,int fa){//卷积 f
	cur[u]=1; f[u][1]=a[u];
	for(auto v:G[u]){
		if(v==fa) continue;
		F(v,u); int up=min(cur[u]+cur[v],k);
		for(int i=cur[u];i>=1;i--)//从 1 开始,因为强制选择 u 
			for(int j=min(cur[v],up-i);j>=1;j--)
				cmax(f[u][i+j],f[u][i]+f[v][j]);
		cur[u]=up;
	}
}
void Dp(int u,int fa){//对于每个点卷积答案,然后先卷积 h,再得到 g
	int S=g[u].size();//统计答案
	for(int i=max(k-S+1,1);i<=min(sz[u],k);i++)
		cmax(ans[u],f[u][i]+g[u][k-i]);
	int c=0; son[0]=0;
	for(auto v:G[u])
		if(v!=fa) son[++c]=v;
	if(!c) return ;
	
	h[0].clear(); h[1].clear();
	h[0].resize(c+1); h[1].resize(c+2);
	h[1][c+1].resize(1,0);
	
	//calc h0
	h[0][0]=g[u]; int suf=min(sz[u],n-sz[u]);
	for(int z=1;z<=c;z++){
		int v=son[z]; suf-=sz[v];
		h[0][z].resize(min(suf,k)+1,0);
		for(int i=0;i<=min(suf+sz[v],k);i++)
			for(int j=0;j<=sz[v]&&i+j<=min(suf,k);j++)
				cmax(h[0][z][i+j],h[0][z-1][i]+f[v][j]);
	}
	
	//calc h1
	h[1][c]=f[son[c]]; cur[u]=min(k,sz[son[c]]);
	for(int z=c-1;z>=1;z--){
		int v=son[z],up=min(cur[u]+sz[v],k);
		h[1][z].resize(up+1,0);
		for(int i=0;i<=cur[u];i++)
			for(int j=0;j<=sz[v]&&i+j<=up;j++)
				cmax(h[1][z][i+j],h[1][z+1][i]+f[v][j]);
		cur[u]=up;
	}
	for(int i=1;i<=c;i++){//卷积 g
		int v=son[i],z=min(k,n-sz[v]); 
		g[v].resize(z+1,0); 
		for(int p=0;p<h[0][i-1].size();p++)
			for(int q=max(k-sz[v]-p-1,0);q<h[1][i+1].size()&&p+q+1<=z;q++)
				cmax(g[v][p+q+1],a[u]+h[0][i-1][p]+h[1][i+1][q]);
	}
	
	for(auto v:G[u])
		if(v!=fa) Dp(v,u);
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n-1;i++){
		int u,v; cin>>u>>v;
		G[u].pb(v); G[v].pb(u);
	}
	dfs(1,0); F(1,0); g[1].pb(0); Dp(1,0);
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

5 3
6 10 4 3 4
3 4
4 2
2 5
5 1

output:


result: