爆0求调!
查看原帖
爆0求调!
1010766
materia1ist楼主2024/8/10 09:54

P3574

60分,样例都过了,gpt生成的大数据也和题解跑的一样,但就是几个点没a,求大犇指点

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> graph;
vector<int> wt, w, out, mark;//wt ->溢出时间,w->原来要花的时间,out->该节点往下的边总数
bool cmp(int a, int b)
{
    return wt[a] > wt[b];
}
int initout(int u)
{
    int ans = 0;
    if (graph[u].size() == 0)
    {
        return 0;
    }
    for (int i = 0; i < graph[u].size(); i++)
    {
        ans += 2 + initout(graph[u][i]);
    }
    return out[u] = ans;
}
void dp(int u)
{
    if (graph[u].size() == 0)
    {
        return;
    }
    for (int i = 0; i < graph[u].size(); i++)
    {
        dp(graph[u][i]);
    }
    sort(graph[u].begin(), graph[u].end(), cmp);
    int now = wt[u], p;
    for (int i = 0; i < graph[u].size(); i++)
    {
        int v = graph[u][i];
        now--;
        now -= out[v];
        now = max(now, wt[v]);
        now--;
    }
    wt[u] = (now > 0 ? now : 0);
    return;
}
int main()
{
   // freopen("poi2014_far_farmcraft_large_test.txt", "r", stdin);
    int n, t;
    cin >> n;
    graph.resize(n + 1);
    w.resize(n + 1);
    wt.resize(n + 1);
    out.resize(n + 1);
    mark.resize(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> t;
        wt[i] = w[i] = t;
    }
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        if ((mark[u] == 0 && u != 1) || v == 1)
        {
            swap(u, v);
        }
        graph[u].push_back(v);
        mark[u] = 1;
        mark[v] = 1;
    }
    initout(1);
    t = wt[1];
    wt[1] = 0;
    dp(1);
    cout << max(wt[1], t) + 2 * (n - 1);
}
2024/8/10 09:54
加载中...