QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#576088#6437. Paimon's TreeHarry27182WA 209ms7964kbC++141.9kb2024-09-19 18:20:032024-09-19 18:20:04

Judging History

你现在查看的是最新测评结果

  • [2024-09-19 18:20:04]
  • 评测
  • 测评结果:WA
  • 用时:209ms
  • 内存:7964kb
  • [2024-09-19 18:20:03]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dep[155],dp[155][155][155],T,n,h[155],u,v,w[155],f[155];
int siz[155],num[155][155],deg[155],cnt,dis[155][155];
struct edge{int v,nxt;}e[305];vector<pair<int,int> >g[155];
void add(int u,int v){e[++cnt]={v,h[u]};h[u]=cnt;}
void dfs(int u,int fa,int s)
{
	dis[s][u]=dis[s][fa]+1;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs(v,u,s);
	}
}
void dfs2(int u,int fa)
{
	dep[u]=dep[fa]+1;siz[u]=1;f[u]=fa;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs2(v,u);siz[u]+=siz[v];
	}
}
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	cin>>T;
	while(T--)
	{
		cin>>n;n++;int ans=0;cnt=0;
		for(int i=1;i<n;i++)cin>>w[i];
		for(int i=1;i<=n;i++)h[i]=0;
		for(int i=1;i<n;i++)
		{
			cin>>u>>v;
			add(u,v);add(v,u);
		}
		for(int i=0;i<=n;i++)g[i].clear();
		for(int i=1;i<=n;i++)
		{
			dis[i][0]=-1;dfs(i,0,i);
			for(int j=1;j<=n;j++)g[dis[i][j]].emplace_back(make_pair(i,j));
		}
		dfs2(1,0);
		for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=0;k<n;k++)dp[i][j][k]=-0x3f3f3f3f3f3f3f3f;
		for(int i=1;i<=n;i++)dp[i][i][0]=0;
		for(int i=0;i<=n;i++)
		{
			for(int j=0;j<g[i].size();j++)
			{
				int u=g[i][j].first,v=g[i][j].second;
				for(int k=0;k<n;k++)
				{
					if(k+1<n)dp[u][v][k+1]=max(dp[u][v][k+1],dp[u][v][k]);
					for(int p=h[u];p;p=e[p].nxt)
					{
						int now=n-1-(dep[e[p].v]>dep[u]?siz[e[p].v]:n-siz[u]);
						if(dis[e[p].v][v]==i+1&&k<=now)dp[e[p].v][v][k+1]=max(dp[e[p].v][v][k+1],dp[u][v][k]+w[k+1]);
					}
					for(int p=h[v];p;p=e[p].nxt)
					{
						int now=n-1-(dep[e[p].v]>dep[v]?siz[e[p].v]:n-siz[v]);
						if(dis[u][e[p].v]==i+1&&k<=now)dp[u][e[p].v][k+1]=max(dp[u][e[p].v][k+1],dp[u][v][k]+w[k+1]);
					}
				}
			}
		}
		for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=max(ans,dp[i][j][n-1]);
		cout<<ans<<'\n'; 
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5764kb

input:

2
5
1 7 3 5 4
1 3
2 3
3 4
4 5
4 6
1
1000000000
1 2

output:

16
1000000000

result:

ok 2 number(s): "16 1000000000"

Test #2:

score: -100
Wrong Answer
time: 209ms
memory: 7964kb

input:

5000
19
481199252 336470888 634074578 642802746 740396295 773386884 579721198 396628655 503722503 971207868 202647942 2087506 268792718 46761498 443917727 16843338 125908043 691952768 717268783
9 4
4 18
12 9
10 9
4 1
6 12
2 18
9 13
6 14
4 8
2 3
10 17
2 20
19 20
5 1
12 15
15 16
4 7
17 11
4
240982681 ...

output:

5750811120
1896999359
4208559611
4140156713
5361004844
1875024569
3690026656
3702623113
3412485417
7807375141
5341435147
2355946110
3090496776
5626636202
4729664767
2207592767
572868833
4759005973
2944749369
2538044586
3083947956
5757497518
1421427135
3971435093
1197051728
396588615
251138097
221986...

result:

wrong answer 48th numbers differ - expected: '5317528311', found: '5514819848'