제출 #1299339

#제출 시각아이디문제언어결과실행 시간메모리
1299339Jawad_Akbar_JJConstruction of Highway (JOI18_construction)C++20
100 / 100
281 ms27908 KiB
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;
const int N = 1<<17;
vector<int> nei[N];
vector<pair<int, int>> vec[N];
int ft[N], cl[N], tp[N], ch[N], Par[N], hei[N], a[N], b[N];

map<int, int> mp, mp2;
void Add(int i, int v){
	for (; i < N; i += i & -i)
		ft[i] += v;
}

int get(int i, int ans = 0){
	for (; i ; i -= i & -i)
		ans += ft[i];
	return ans;
}

void dfs(int u,int id = 0){
	ch[u] = 1;
	for (int i : nei[u]){
		Par[i] = u, hei[i] = hei[u] + 1;
		dfs(i);
		ch[u] += ch[i];

		if (ch[i] > ch[nei[u][0]])
			swap(nei[u][id], nei[u][0]);
		tp[i] = i;
		id++;
	}
}

void dfs2(int u){
	if (nei[u].size() > 0)
		tp[nei[u][0]] = tp[u];

	for (int i : nei[u])
		dfs2(i);
}

int clac_and_upd(int u, int vr){
	vector<pair<int, int>> temp, Now;
	while (u){
		int t = tp[u], sz2 = hei[u] - hei[t] + 1, sz = sz2, k = 0;
		while (sz){
			if (vec[t].back().second > sz){
				temp.push_back({vec[t].back().first, sz});
				vec[t].back().second -= sz;
				sz = 0;
			}
			else{
				sz -= vec[t].back().second;
				temp.push_back(vec[t].back());
				vec[t].pop_back();
			}
		}
		vec[t].push_back({cl[vr], sz2 + (tp[vr] == t)});
		u = Par[t];

		for (int i=temp.size()-1; i >= 0;i--)
			Now.push_back(temp[i]);
		vector<pair<int,int>> ().swap(temp);
	}

	long long Ans = 0;
	for (auto [c, cnt] : Now){
		Ans += 1LL * get(c-1) * cnt;
		Add(c, cnt);
	}
	for (auto [c, cnt] : Now)
		Add(c, -cnt);
	return Ans;
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, cur = 0;
	cin>>n;

	for (int i=1;i<=n;i++)
		cin>>cl[i], mp[cl[i]];
	for (auto [i, j] : mp)
		mp2[i] = ++cur;
	for (int i=1;i<=n;i++)
		cl[i] = mp2[cl[i]];

	for (int i=1;i<n;i++){
		cin>>a[i]>>b[i];
		nei[a[i]].push_back(b[i]);
	}

	dfs(1);
	dfs2(tp[1] = 1);


	vec[1].push_back({cl[1], 1});

	for (int i=1;i<n;i++){
		cout<<clac_and_upd(a[i], b[i])<<endl;
		if (tp[b[i]] == b[i])
			vec[b[i]].push_back({cl[b[i]], 1});
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...