Submission #1223632

#TimeUsernameProblemLanguageResultExecution timeMemory
1223632chaeryeongConstruction of Highway (JOI18_construction)C++20
16 / 100
2094 ms3024 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 25;
int n, c[MAXN];
array <int, 2> ee[MAXN];
int p[MAXN], dep[MAXN], v[MAXN];
void solve () {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> c[i];
	}
	for (int i = 1; i < n; i++) {
		int x, y; cin >> x >> y;
		ee[i] = {x, y};
		p[y] = x;
		dep[y] = 1 + dep[x];
	}
	v[1] = c[1];
	for (int i = 1; i < n; i++) {
		int x = ee[i][0], y = ee[i][1];
		vector <int> d;
		while (true) {
			d.push_back(v[x]);
			if (x == 1) {
				break;
			}
			x = p[x];
		}
		reverse(d.begin(), d.end());
		vector <pair <int, int>> gg;
		for (int j = 0; j < (int)d.size(); j++) {
			int l = j;
			while (l + 1 < (int)d.size() && d[l + 1] == d[j]) {
				l++;
			}
			gg.push_back({d[j], l - j + 1});
			j = l;
		}
		int ans = 0;
		for (int j = 0; j < (int)gg.size(); j++) {
			for (int k = j + 1; k < (int)gg.size(); k++) {
				ans += (gg[j].first > gg[k].first) * (gg[j].second * gg[k].second);
			}
		}
		cout << ans << '\n';
		int t = c[y];
		while (true) {
			v[y] = t;
			if (y == 1) {
				break;
			}
			y = p[y];
		}
	}
}
signed main () {
	ios::sync_with_stdio(0); cin.tie(0);
	int tc = 1; //cin >> tc;
	while (tc--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...