95782024-02-23 11:42:01csaron71Tevefarmcpp17Elfogadva 50/50103ms16868 KiB
#include <bits/stdc++.h>
using namespace std;

vector<long long> ertek;
vector<long long> apa;
vector<vector<long long> > gyerekek;
vector<int> vissza;
vector<long long> veg;

long long kereses(long long x) {
	if (gyerekek[x].size()>0) {
		long long epp=ertek[x];
		long long masik=0;
		for (long long sz : gyerekek[x]) {
			masik+=kereses(sz);
		}
		if (epp>=masik) {
			//veg.push_back(x);
			vissza[x]=10;
			return epp;
		}
		else {
			vissza[x]=-10;
			return masik;
		}
		//return max(epp, masik);
	}
	else {
		//veg.push_back(x);
		//vissza[x]=-10;
		return ertek[x];
	}
	
}

void visszaf (int x) {
	if (vissza[x]==-10) {
		for (int sz : gyerekek[x]) {
			visszaf(sz);
		}
	}
	else {
		veg.push_back(x+1);
	}
}

int main() {
	long long n;
	cin >> n;
	ertek.resize(n);
	vissza.assign(n, 0);
	for (long long i=0; i<n; i++) {
		cin >> ertek[i];
	}
	apa.resize(n);
	apa[0]=0;
	gyerekek.assign(n, vector<long long>());
	for (long long i=1; i<n; i++) {
		cin >> apa[i];
		apa[i]--;
		gyerekek[apa[i]].push_back(i);
	}

	cout << kereses(0) << "\n";

	visszaf(0);

	//sort(veg.begin(), veg.end());
	cout << veg.size() << "\n";
	for (long long sz : veg) {
		cout << sz << " ";
	}
	cout << "\n";
	/*for (auto sz : vissza) {
		cout << sz << " ";
	}*/
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/03ms1812 KiB
2Elfogadva0/03ms2256 KiB
3Elfogadva4/43ms2220 KiB
4Elfogadva4/43ms2436 KiB
5Elfogadva4/43ms2528 KiB
6Elfogadva4/43ms2912 KiB
7Elfogadva4/443ms9916 KiB
8Elfogadva6/652ms11400 KiB
9Elfogadva6/663ms13304 KiB
10Elfogadva6/670ms14372 KiB
11Elfogadva6/693ms15620 KiB
12Elfogadva6/6103ms16868 KiB