QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#292713#6437. Paimon's TreeDoqeWA 30ms5636kbC++142.2kb2023-12-28 11:42:092023-12-28 11:42:10

Judging History

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

  • [2023-12-28 11:42:10]
  • 评测
  • 测评结果:WA
  • 用时:30ms
  • 内存:5636kb
  • [2023-12-28 11:42:09]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=152;
int F[N][N][N],n,s[N];
set<vector<int>>S;
vector<int>to[N];
int sta[N],mxdep,sz[N];
void ini(int u,int f){sz[u]=1;for(int v:to[u])if(v!=f)ini(v,u),sz[u]+=sz[v];}
void dfs(int u,int f,int top)
{
    if(f!=u&&f&&to[u].size()==1)
    {
        if(mxdep<top)mxdep=top,S.clear();sta[top]=0;
        if(mxdep==top)S.insert(vector<int>(sta+1,sta+top+1));
    }
    for(int v:to[u])if(v!=f)
    {
        sta[top]=sz[u]-sz[v]-1;
        dfs(v,u,top+1);
    }
}
int a[N];
__inline void ckmax(int&A,int B){(A<B)?(A=B):0;}
int main()
{
    cin.tie(0)->sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;++n;mxdep=0;
        int ans=0;
        for(int i=0;i<n-1;++i)cin>>a[i];
        for(int i=1,u,v;i<n;++i)cin>>u>>v,to[u].push_back(v),to[v].push_back(u);
        for(int i=1;i<=n;++i)if(to[i].size()==1)/*cerr<<"DFS: "<<i<<endl,*/ini(i,0),dfs(i,i,1);
        // cerr<<"ED\n";
        for(const vector<int>&A:S)
        {
            // cerr<<A.size()<<": ";
            // for(auto k:A)cerr<<k<<"_";cerr<<endl;
            for(int i=0;i<n;++i)
                for(int l=0;l<mxdep;++l)
                    for(int r=0;r<mxdep;++r)
                        F[i][l][r]=-1e9;
            for(int i=0;i<mxdep;++i)s[i]=(i?s[i-1]:0)+A[i];
            for(int i=0;i<mxdep;++i)F[0][i][i]=0;
            for(int i=0;i<n-1;++i)
                for(int l=0;l<mxdep;++l)
                    for(int r=l;r<mxdep;++r)
                        if(s[r]-(l?s[l-1]:0)+(r-l+1)>=i)
                        {
                            ckmax(F[i+1][l][r],F[i][l][r]);
                            if(l)ckmax(F[i+1][l-1][r],F[i][l][r]+a[i]);
                            if(r+1!=mxdep)ckmax(F[i+1][l][r+1],F[i][l][r]+a[i]);
                        }
            // for(int i=0;i<=n;++i)
            //     for(int l=0;l<mxdep;++l)
            //         for(int r=l;r<mxdep;++r)
            //             if(s[r]-(l?s[l-1]:0)+(r-l+1)>=i)
            //                 cerr<<"F "<<i<<" "<<l<<"~"<<r<<" : "<<F[i][l][r]<<endl;
            ckmax(ans,F[n-1][0][mxdep-1]);
        }
        S.clear();
        for(int i=1;i<=n;++i)to[i].clear();
        cout<<ans<<endl;
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 30ms
memory: 5636kb

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:

2129360168
1896999359
1028319689
2130955200
2098658116
1875024569
1501710478
1744925367
2145482543
2028763857
2122049976
2136473141
1529043878
2034715580
2004681859
1788935439
572868833
2085919754
1053814794
1927219359
1532305147
1770124802
1421427135
1728232937
1197051728
396588615
251138097
789785...

result:

wrong answer 1st numbers differ - expected: '5750811120', found: '2129360168'