Submission #935686

# Submission time Handle Problem Language Result Execution time Memory
935686 2024-02-29T11:32:31 Z OAleksa Regions (IOI09_regions) C++14
8 / 100
8000 ms 113036 KB
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
const int N = 2e5 + 69;
const int R = 25069;
const int K = 17;
const int B = 450;
int n, q, r, a[N], cnt[R];
int timer, tin[N], tout[N], up[N][K];
int st[R * K * 15], lc[R * K * 15], rc[R * K * 15];
int root[N], node;
map<pair<int, int>, int> was;
vector<int> g[N], clr[R];
void modify(int v, int v1, int tl, int tr, int pos) {
	if (tl == tr)
		st[v] = st[v1] + 1;
	else {
		int mid = (tl + tr) / 2;
		if (pos <= mid) {
			lc[v] = ++node;
			rc[v] = rc[v1];
			modify(lc[v], lc[v1], tl, mid, pos);
		}
		else {
			rc[v] = ++node;
			lc[v] = lc[v1];
			modify(rc[v], rc[v1], mid + 1, tr, pos);
		}
		st[v] = st[lc[v]] + st[rc[v]];
	}
}

int get(int v, int tl, int tr, int pos) {
	if (tl == tr)
		return st[v];
	else {
		int mid = (tl + tr) / 2;
		if (pos <= mid)
			return get(lc[v], tl, mid, pos);
		else
			return get(rc[v], mid + 1, tr, pos);
	}
}

bool anc(int a, int b) {
	return tin[a] <= tin[b] && tout[a] >= tout[b];
}
int lca(int a, int b) {
	if (anc(a, b))
		return a;
	else if (anc(b, a))
		return b;
	for (int i = K - 1;i >= 0;i--) {
		if (!anc(up[a][i], b) && up[a][i] > 0)	
			a = up[a][i];
	}
	return up[a][0];
}
void dfs(int v, int p) {
	tin[v] = ++timer;
	up[v][0] = p;
	root[v] = ++node;
	modify(root[v], root[p], 1, n, a[v]);
	for (int i = 1;i < K;i++)
		up[v][i] = up[up[v][i - 1]][i - 1];
	for (auto u : g[v]) {
		if (u == p)
			continue;
		dfs(u, v);
	}
	tout[v] = timer;
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int tt = 1;
  //cin >> tt;
  while (tt--) {
  	cin >> n >> r >> q;
  	cin >> a[1];
  	clr[a[1]].push_back(1);
  	for (int i = 2;i <= n;i++) {
  		int x;
  		cin >> x >> a[i];
  		g[x].push_back(i);
  		g[i].push_back(x);
  		cnt[a[i]]++;
  		clr[a[i]].push_back(i);
  	}
  	dfs(1, 0);
  	for (int i = 1;i <= r;i++) {
			sort(clr[i].begin(), clr[i].end(), [&](int x, int y) {
				return tin[x] < tin[y];
			});
		}
  	while (q--) {
  		int r1, r2;
  		cin >> r1 >> r2;
  		int ans = 0;
  		if (was.count({r1, r2}))
  			ans = was[{r1, r2}];
  		else if (cnt[r1] > B && cnt[r2] > B) {
  			//nadji lca i samo dfs
  			if (!clr[r1].empty()) {
  				int lc = clr[r1].front();
  				for (int i = 1;i < (int)clr[r1].size();i++)
  					lc = lca(lc, clr[r1][i]);
  				function<void(int, int, int, int, int)> dfs = [&](int v, int p, int r1, int r2, int c) {
  					if (a[v] == r2)
  						ans += c;
  					for (auto u : g[v]) {
  						if (u == p)
  							continue;
  						dfs(u, v, r1, r2, c + (a[v] == r1));
  					}
  				};
  				dfs(lc, up[lc][0], r1, r2, 0);
  			}
  		}
  		else if (cnt[r1] <= B) {
  			//binarna
  			for (auto i : clr[r1]) {
  				int m = clr[r2].size();
	  			int l = 0, r = m - 1, L = m;
	  			while (l <= r) {
	  				int mid = (l + r) / 2;
	  				if (tin[clr[r2][mid]] >= tin[i]) {
	  					L = mid;
	  					r = mid - 1;
	  				}
	  				else
	  					l = mid + 1;
	  			}
	  			l = 0, r = m - 1;
	  			int R = m - 1;
	  			while (l <= r) {
	  				int mid = (l + r) / 2;
	  				if (tin[clr[r2][mid]] <= tout[i]) {
	  					R = mid;
	  					l = mid + 1;
	  				}
	  				else
	  					r = mid - 1;
	  			}
	  			ans += max(0, R - L + 1);
  			}
  		}
  		else {
  			for (auto i : clr[r2]) 
  				ans += get(root[i], 1, n, r1);
  		}
  		//nsqrtnlogn
  		cout << ans << endl;
  		if (!was.count({r1, r2}))
  			was[{r1, r2}] = ans;
  	}
  }
  return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 14936 KB Output isn't correct
2 Incorrect 3 ms 14936 KB Output isn't correct
3 Incorrect 4 ms 15252 KB Output isn't correct
4 Incorrect 6 ms 15016 KB Output isn't correct
5 Incorrect 7 ms 15448 KB Output isn't correct
6 Correct 14 ms 15432 KB Output is correct
7 Incorrect 18 ms 16252 KB Output isn't correct
8 Incorrect 21 ms 16576 KB Output isn't correct
9 Correct 35 ms 18388 KB Output is correct
10 Incorrect 59 ms 19368 KB Output isn't correct
11 Incorrect 87 ms 19732 KB Output isn't correct
12 Incorrect 108 ms 22772 KB Output isn't correct
13 Incorrect 121 ms 23724 KB Output isn't correct
14 Incorrect 176 ms 25036 KB Output isn't correct
15 Correct 217 ms 32240 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1260 ms 42684 KB Output isn't correct
2 Incorrect 1187 ms 42996 KB Output isn't correct
3 Correct 1477 ms 53716 KB Output is correct
4 Incorrect 182 ms 26916 KB Output isn't correct
5 Incorrect 223 ms 32516 KB Output isn't correct
6 Incorrect 521 ms 34680 KB Output isn't correct
7 Incorrect 516 ms 40112 KB Output isn't correct
8 Incorrect 1000 ms 55796 KB Output isn't correct
9 Incorrect 1782 ms 75188 KB Output isn't correct
10 Execution timed out 8006 ms 86456 KB Time limit exceeded
11 Incorrect 2729 ms 93280 KB Output isn't correct
12 Incorrect 1094 ms 81928 KB Output isn't correct
13 Incorrect 1459 ms 84212 KB Output isn't correct
14 Execution timed out 8052 ms 89468 KB Time limit exceeded
15 Incorrect 2551 ms 101416 KB Output isn't correct
16 Incorrect 2634 ms 102280 KB Output isn't correct
17 Incorrect 6763 ms 113036 KB Output isn't correct