240122026-02-03 17:29:29arnoldbeilandTevefarmcpp17Elfogadva 50/50107ms6436 KiB
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

void dfs(int v,
         const vector<vector<int>> &gyerekek,
         vector<long long> &dp,
         vector<long long> &t)
{
    long long sum = 0;

    for (auto gy : gyerekek[v]) {
        dfs(gy, gyerekek, dp, t);
        sum += dp[gy];
    }

    if (sum > t[v])
        dp[v] = sum;
    else
        dp[v] = t[v];
}

void gyujt(int v,
           const vector<vector<int>> &gyerekek,
           vector<long long> &dp,
           vector<long long> &t,
           vector<int> &halmaz)
{
    if (dp[v] == t[v]) {
        halmaz.push_back(v);
    }
    else {
        for (auto gy : gyerekek[v]) {
            gyujt(gy, gyerekek, dp, t, halmaz);
        }
    }
}

int main()
{
    //ifstream fin("input.txt");
    istream &fin = cin;

    //ofstream fout("output.txt");
    ostream &fout = cout;

    int n;
    fin >> n;

    vector<long long> t(n+1, 0);
    for (int i = 1; i <= n; i++)
        fin >> t[i];

    vector<vector<int>> gyerekek(n+1);

    for (int i = 2; i <= n; i++) {
        int apa;
        fin >> apa;
        gyerekek[apa].push_back(i);
    }

    vector<long long> dp(n+1, -1);

    dfs(1, gyerekek, dp, t);

    fout << dp[1] << "\n";

    vector<int> halmaz;

    gyujt(1, gyerekek, dp, t, halmaz);

    fout << halmaz.size() << "\n";

    for (auto i : halmaz)
        fout << i << " ";
    fout << "\n";

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms508 KiB
2Elfogadva0/02ms508 KiB
3Elfogadva4/41ms316 KiB
4Elfogadva4/41ms316 KiB
5Elfogadva4/41ms316 KiB
6Elfogadva4/42ms440 KiB
7Elfogadva4/441ms3364 KiB
8Elfogadva6/652ms4148 KiB
9Elfogadva6/661ms4684 KiB
10Elfogadva6/672ms5264 KiB
11Elfogadva6/693ms5844 KiB
12Elfogadva6/6107ms6436 KiB