Submission #1172699

#TimeUsernameProblemLanguageResultExecution timeMemory
1172699NurislamConstruction of Highway (JOI18_construction)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>

using namespace std;


#define int long long
#define pb push_back

int inf = 1e18; 

const int mod = 1e9 + 7;

struct bitt {
	vector<int> t;
	int n;
	bitt (int N) : n(N+1) {
		t.resize(n+2);
	};
	
	void upd(int i, int va) { i ++ ;
		for(; i < n; i += (i & -i)) t[i] += va;
	};
	
	int get(int i) { i ++ ;
		int res = 0;
		for(; i > 0; i -= (i & -i)) res += t[i];
		return res;
	};
	
	int get(int l, int r) { r--;
		return get(r ) - get( -- l );
	};
};

void solve(){
	int n; cin >> n;
	
	vector<int> a(n+1);
	for(int i = 1; i <= n; i++ )cin >> a[i];
	
	vector<int> b = a;
	sort(b.begin(), b.end());
	b.erase(unique(b.begin(), b.end()), b.end());
	for(int i = 1; i <= n; i ++ )a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin();
	
	vector<int> pr(n+1, 1), us(n+1, 0);
	us[1] = 1;
	for(int i = 1; i < n; i++ ) {
		int u, v;
		cin >> u >> v;
		
		if(!us[u] || us[v])continue;
		
		pr[v] = u;
		vector<int> ord;
		int x = v;
		while(x != 1) ord.push_back(x = pr[x]);
		reverse(ord.begin(), ord.end());
		
		int ans = 0, cnt = 0;
		bitt t(n);
		for(int x : ord) {
			ans += cnt - t.get(a[x]);
			cnt ++ ;
			t.upd(a[x], 1);
		};
		cout << ans << '\n';
		for(int x : ord)
			a[x] = a[v];
		us[v] = 1;
	};
};

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int tt = 1;
	//cin >> tt;
	
	while(tt -- ){
		solve();
	};
	
};
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...