Submission #1214102

#TimeUsernameProblemLanguageResultExecution timeMemory
1214102PenguinsAreCuteTourism (JOI23_tourism)C++17
28 / 100
5093 ms3776 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(v) begin(v),end(v)
#define REP(i,a,b) for(int i=a;i<b;i++)
const int MAXN = 1e5 + 5;
int main() {
	int n, m, q;
	cin >> n >> m >> q;
	vector<int> x(n,0), d(n,0), h(n,0), j(n,0), pre(n,1), ord(n-1), c(m);

	REP(i,1,n) {
		int a, b;
		cin >> a >> b;
		d[--a]++;
		d[--b]++;
		x[a]^=b;
		x[b]^=a;
	}

	int cnt = 0;
	d[0] = 0;
	REP(i,0,n)
		for(int k=i;d[k]==1;k=x[k]) {
			ord[cnt++] = k;
			d[k]--;
			d[x[k]]--;
			x[x[k]] ^= k;
			pre[x[k]] += pre[k];
		}
	h[0] = j[0] = 0;
	while(cnt--) {
		int k = ord[cnt];
		h[k] = h[x[k]] + 1;
		pre[x[k]] -= exchange(pre[k], pre[x[k]]);
		j[k] = (h[j[j[x[k]]]]+h[x[k]]==h[j[x[k]]]*2?j[j[x[k]]]:x[k]);
	}

	auto lca = [&h,&j,&x](int a, int b) {
		if(h[a] > h[b])
			swap(a, b);
		while(h[b] > h[a])
			b = (h[j[b]] >= h[a] ? j[b] : x[b]);
		while(a != b) {
			if(j[a] == j[b])
				a = x[a], b = x[b];
			else
				a = j[a], b = j[b];
		}
		return a;
	};


	REP(i,0,m) {
		cin >> c[i];
		c[i]--;
	}

	while(q--) {
		int l, r;
		cin >> l >> r;
		vector<int> v;
		for(int i=l-1;i<r;i++)
			v.push_back(c[i]);
		sort(v.begin(),v.end(),[&pre](int a, int b) {return pre[a] < pre[b];});
		long long ans = 1;
		for(auto i: v)
			ans += h[i];
		for(int i=0;i<int(v.size())-1;i++)
			ans -= h[lca(v[i],v[i+1])];
		ans -= h[lca(v[0],v.back())];
		cout << ans << "\n";
	}
}
#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...