Submission #1201207

#TimeUsernameProblemLanguageResultExecution timeMemory
1201207viduxTree (IOI24_tree)C++17
17 / 100
2095 ms17684 KiB
#include <bits/stdc++.h>
using namespace std;

//#define LOCAL

#define FOR(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n, m) for (int i = n; i <= m; ++i)
#define REPR(i, n, m) for (int i = n; i >= m; --i)
#define FORR(x, a) for (auto& x : a)
#define FORR2(x, y, a) for (auto& [x, y] : a)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define SZ(a) ((int)a.size())

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;

const int INF = 1e9;
const ll LLINF = 1e18;

vi p, w;
vvi child;
ll leafs;
bool t5;

void init(std::vector<int> P, std::vector<int> W) {
	p = P;
	w = W;
	int n = SZ(w);
	t5 = 1;
	FOR(i, n) if (w[i] != 1) { t5 = 0; break; }
	child = vvi(SZ(p));
	REP(i, 1, SZ(p)-1) {
		child[p[i]].push_back(i);
	}
	leafs = 0;
	FOR(i, n) if (SZ(child[i]) == 0) leafs++;
}

long long query(int L, int R) {
	if (t5 == 1) {
		ll ans = leafs*L;
		if (ans > R) ans += ans - R;
		return ans;
	}
	ll ans = 0;
	auto dfs = [&](int i, auto dfs) -> ll {
		if (SZ(child[i]) == 0) {
			ans += ((ll)L) * (ll)w[i];
			return L;
		}
		ll sum = 0;
		FORR(j, child[i]) sum += dfs(j, dfs);
		if (sum > R) {
			ans += (sum - (ll)R) * (ll)w[i];
			sum = R;
		}
		return sum;
	};
	ll extra = dfs(0, dfs);
	if (extra > R) ans += (extra - (ll)R) * (ll)w[0];
	return ans;
}

#ifdef LOCAL
int main() {
	init({-1, 0, 0}, {1, 1, 1});
	cout << query(1, 1) << endl;
	cout << query(1, 2) << endl;
    return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...