QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#875866 | #4815. Flower's Land | Mirasycle | WA | 0ms | 6796kb | C++14 | 1.8kb | 2025-01-30 13:41:43 | 2025-01-30 13:41:45 |
Judging History
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;
}
詳細信息
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'