QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#129920#6437. Paimon's TreekkioWA 476ms20028kbC++142.4kb2023-07-23 08:24:012023-07-23 08:24:03

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-23 08:24:03]
  • Judged
  • Verdict: WA
  • Time: 476ms
  • Memory: 20028kb
  • [2023-07-23 08:24:01]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=155,inf=1e18;
int n;
int f[maxn][maxn][maxn][4],a[maxn];
int fp[maxn][maxn];
vector<int> G[maxn];
void dfs(int u,int F)
{
    for(int v:G[u])
        if(v!=fp[F][u])
        {
            fp[F][v]=u;
            dfs(v,F);
        }
}
int siz[maxn],dep[maxn];
inline void predfs(int u,int fa)
{
    siz[u]=1;
    for(int v:G[u])
        if(v!=fa)
        {
            dep[v]=dep[u]+1;
            predfs(v,u);
            siz[u]+=siz[v];
        }
}
inline int getsiz(int fu,int u)
{
    if(dep[fu]<dep[u])return siz[u];
    else return n-siz[fu];
}
inline void upd(int u,int v,int t,int k,int w)
{if(f[u][v][t][k]<w)f[u][v][t][k]=w;}
void solve()
{
    scanf("%lld",&n);n++;
    for(int i=1;i<n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)G[i].clear();
    for(int i=1;i<n;i++)
    {
        static int u,v;scanf("%lld%lld",&u,&v);
        G[u].push_back(v);G[v].push_back(u);
    }
    for(int i=1;i<=n;i++)
    {
        fp[i][i]=0;
        dfs(i,i);
    }
   	dep[1]=0;predfs(1,0);
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int t=0;t<=n;t++)for(int k=0;k<=3;k++)f[i][j][t][k]=-inf;
	for(int i=1;i<=n;i++)f[i][i][0][3]=0;
	for(int t=0;t<n-1;t++)
		for(int k=3;k>=0;k--)
   			for(int u=1;u<=n;u++)
   				for(int v=1;v<=n;v++) 	
			   	{
					if(f[u][v][t][k]==-inf)continue;
					int fu=fp[v][u],fv=fp[u][v],w=f[u][v][t][k],g=(u==v)?0:n-getsiz(fu,u)-getsiz(fv,v);
					//printf("%lld %lld %lld %lld %lld !%lld\n",u,v,t,k,f[u][v][t][k],g);
					if(k==3)
					{
						for(int su:G[u])if(su!=fu)upd(su,v,t,1,w);
						for(int sv:G[v])if(sv!=fv)upd(u,sv,t,2,w); 
						if(t+1<=g)upd(u,v,t+1,3,w);
					}		
					if(k==2)
					{
						for(int su:G[u])if(su!=fu)upd(su,v,t,0,w);
						upd(u,v,t+1,3,w+a[t+1]);
						if(t+1<=g)upd(u,v,t+1,2,w);
					}
					if(k==1)
					{
						for(int sv:G[v])if(sv!=fv)upd(u,sv,t,0,w);
						upd(u,v,t+1,3,w+a[t+1]);
						if(t+1<=g)upd(u,v,t+1,1,w); 
					}
					if(k==0)
					{
						upd(u,v,t+1,1,w+a[t+1]);
						upd(u,v,t+1,2,w+a[t+1]);
						if(t+1<=g)upd(u,v,t+1,0,w);
					}
			   	}
	int ans=-1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			ans=max(ans,f[i][j][n-1][3]); 
    printf("%lld\n",ans);
    return;
}
signed main()
{
    int T;
    scanf("%lld",&T);
    while(T--)solve();
    return 0;
}
/*
1
5
1 7 3 5 4
1 3
2 3
3 4
4 5
4 6
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 7796kb

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: 476ms
memory: 20028kb

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
4743710325
1875024569
3690026656
3702623113
3412485417
7807375141
4874373848
2136473141
3090496776
5255698485
4550445099
2207592767
572868833
4644501974
2709451916
2538044586
2924577294
5225343016
1421427135
3971435093
1197051728
396588615
251138097
215311...

result:

wrong answer 5th numbers differ - expected: '5361004844', found: '4743710325'