QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#638357#6438. CrystalflyyldWA 0ms3556kbC++202.0kb2024-10-13 15:43:412024-10-13 15:43:41

Judging History

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

  • [2024-10-13 15:43:41]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3556kb
  • [2024-10-13 15:43:41]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve()
{
    int n;cin>>n;
    vector<int> a(n+1),t(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>t[i];
    vector<int> e[n+1];
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    vector dp(n+1,vector<int>(2));
    function<void(int,int)> dfs=[&](int u,int fa)
    {
        // cerr<<u<<endl;
        int sum=0,maxn=0;
        priority_queue<pair<int,int>> q1,q2;//q1表示依托 q2表示t=3的a[];
        for(auto v:e[u])
        {
            if(v==fa) continue;
            dfs(v,u);
            q1.push({a[v]+dp[v][0]-dp[v][1],v});
            if(t[v]==3) q2.push({a[v],v});
            sum+=dp[v][1];
            maxn=max(maxn,a[v]);
        }
        dp[u][0]=max(dp[u][0],sum);
        if(q2.empty())
        {
            dp[u][1]=max(dp[u][1],maxn+sum);
        }
        else
        {
            auto [x_1,y_1]=q1.top();q1.pop();
            auto [a_1,b_1]=q2.top();q2.pop();
            if(y_1!=b_1) dp[u][1]=max(dp[u][1],x_1+a_1+sum);
            else
            {
                if(q1.size())
                {
                    auto [x_2,y_2]=q1.top();
                    dp[u][1]=max(dp[u][1],x_2+a_1+sum);
                }
                else if(q2.size())
                {
                    auto [a_2,b_2]=q2.top();
                    dp[u][1]=max(dp[u][1],x_1+a_2+sum);
                }
                else
                {
                    dp[u][1]=max({dp[u][1],x_1+sum,a_1+sum});
                }
            }
        }
    };
    dfs(1,0);
    // for(int i=1;i<=n;i++)
    // {
    //     cout<<dp[i][0]<<' '<<dp[i][1]<<endl;
    // }
    cout<<dp[1][1]+a[1]<<endl;
}
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

2
5
1 10 100 1000 10000
1 2 1 1 1
1 2
1 3
2 4
2 5
5
1 10 100 1000 10000
1 3 1 1 1
1 2
1 3
2 4
2 5

output:

10101
10111

result:

ok 2 number(s): "10101 10111"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3544kb

input:

10
6
8 1 1 5 8 9
2 1 2 2 2 2
1 2
2 3
2 4
1 5
2 6
6
6 4 4 1 3 6
2 1 3 3 3 3
1 2
1 3
3 4
4 5
5 6
6
10 5 1 8 5 1
1 3 1 2 2 2
1 2
2 3
2 4
2 5
3 6
10
6 8 8 9 6 9 5 6 6 4
2 1 3 3 2 2 2 2 3 1
1 2
1 3
3 4
4 5
5 6
4 7
2 8
7 9
9 10
7
10 9 1 5 7 5 4
1 1 1 2 1 3 2
1 2
1 3
3 4
3 5
5 6
1 7
5
7 1 1 4 2
3 1 3 2 2
1...

output:

25
24
24
56
31
13
16
28
19
19

result:

wrong answer 6th numbers differ - expected: '14', found: '13'