QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#875866#4815. Flower's LandMirasycleWA 0ms6796kbC++141.8kb2025-01-30 13:41:432025-01-30 13:41:45

Judging History

This is the latest submission verdict.

  • [2025-01-30 13:41:45]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 6796kb
  • [2025-01-30 13:41:43]
  • Submitted

answer

#include<bits/stdc++.h>
#define pb emplace_back
using namespace std;
const int maxn=4e4+10;
const int maxk=3e3+10;
void cmax(int &x,int y){ x=x>y?x:y; }
int n,k,a[maxn],sz[maxn],son[maxn];
int f[maxn][maxk],g[maxn][maxk];
int ans[maxn],cur[maxn],h[maxk];
int pre[maxn],res[maxk]; vector<int> G[maxn];
void dfs(int u,int fa){//卷积 f
	cur[u]=0; sz[u]=1;
	for(auto v:G[u]){
		if(v==fa) continue;
		memcpy(g[v],f[u],sizeof(f[u])); pre[v]=min(sz[u],k);
		dfs(v,u); int up=min(cur[u]+sz[v],k);
		for(int i=cur[u];i>=0;i--)
			for(int j=min(sz[v],up-i);j>=1;j--)
				cmax(f[u][i+j],f[u][i]+f[v][j]);
		cur[u]=up; sz[u]+=sz[v];
	}
	cur[u]=min(cur[u]+1,k);
	for(int i=sz[u];i>=1;i--) f[u][i]=f[u][i-1]+a[u];
}
void Dp(int u,int fa){//对于每个点卷积答案,然后先卷积 h,再得到 g
	for(int i=1;i<=cur[u];i++){
		assert(f[u][i]=k*(5e5));
		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 ;
	
	memcpy(h,g[u],sizeof(g[u]));//g[v] 为前缀背包,h 为后缀背包 
	int P=sz[u];//前缀大小
	for(int z=c;z>=1;z--){
		int v=son[z],lim=min(k,n-sz[v]);  P-=sz[v];
		
		for(int i=0;i<=k;i++) res[i]=0;
		for(int p=pre[v];p>=0;p--)
			for(int q=min(lim-1-p,k);q>=max(k-sz[v]-p-1,0);q--)
				cmax(res[p+q+1],a[u]+g[v][p]+h[q]);		
		memcpy(g[v],res,sizeof(res));
		
		for(int i=0;i<=k;i++) res[i]=0;
		for(int i=0;i<=cur[v];i++)//更新后缀背包 
			for(int j=max(k-P-i-1,0);i+j<=k;j++)
				cmax(res[i+j],f[v][i]+h[j]);
		memcpy(h,res,sizeof(res));
	}
	
	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); 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
Wrong Answer
time: 0ms
memory: 6796kb

input:

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

output:

1500000 1500010 1500013 1500014 1500006 

result:

wrong answer 1st numbers differ - expected: '20', found: '1500000'