답안 #591158

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
591158 2022-07-06T23:30:29 Z GusterGoose27 Inside information (BOI21_servers) C++11
50 / 100
3500 ms 66224 KB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

const int MAXN = 120000;
vector<pii> edges[MAXN];
pair<pii, int> queries[MAXN]; // start, end, time
int lca[MAXN][20];
pii lca_range[MAXN][20];
pii lca_range_rev[MAXN][20];
int depth[MAXN];
int n, k;

void dfs(int cur = 0, int p = -1) {
	for (pii e: edges[cur]) {
		int next = e.first;
		if (next == p) continue;
		depth[next] = depth[cur]+1;
		lca[next][0] = cur;
		lca_range[next][0] = pii(e.second, e.second);
		lca_range_rev[next][0] = pii(e.second, e.second);
		dfs(next, cur);
	}
}

bool move(int &i, int pow, int &s) {
	pii r = lca_range[i][pow];
	if (s >= r.first) return 0;
	s = r.second;
	i = lca[i][pow];
	return 1;
}

bool move_rev(int &i, int pow, int &e) {
	pii r = lca_range_rev[i][pow];
	if (r.second >= e || r.second == -1) return 0;
	e = r.first;
	i = lca[i][pow];
	return 1;
}

bool calc_lca(int a, int b, int e) {
	int s = -1;
	int diff = depth[a]-depth[b];
	int pow = 0;
	while (diff > 0) {
		if (diff & 1) {
			bool bo = move(a, pow, s);
			if (!bo) {
				return 0;
			}
		}
		pow++;
		diff /= 2;
	}
	diff = depth[b]-depth[a];
	pow = 0;
	while (diff > 0) {
		if (diff & 1) {
			bool bo = move_rev(b, pow, e);
			if (!bo) {
				return 0;
			}
		}
		pow++;
		diff /= 2;
	}
	for (int i = 19; i >= 0; i--) {
		if (lca[a][i] != lca[b][i]) {
			bool bo = move(a, i, s);
			if (!bo) {
				return 0;
			}
			bo = move_rev(b, i, e);
			if (!bo) {
				return 0;
			}
		}
	}
	if (a != b) {
		bool bo = move(a, 0, s);
		if (!bo) {
			return 0;
		}
		bo = move_rev(b, 0, e);
		if (!bo) {
			return 0;
		}
	}
	if (s >= e) {
		return 0;
	}
	return 1;
}

int spec(int i) {
	int q = queries[i].first.first;
	int t = queries[i].first.second;
	int c = 0;
	for (int i = 0; i < n; i++) {
		c += calc_lca(q, i, t);
	}
	return c;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> n >> k;
	int t = 0;
	int p = 0;
	for (int i = 0; i < n+k-1; i++) {
		char c;
		int a, b;
		cin >> c >> a;
		a--;
		if (c == 'C') {
			queries[p++] = pair<pii, int>(pii(a, t), -1);
			continue;
		}
		cin >> b; b--;
		if (c == 'S') {
			edges[a].push_back(pii(b, t));
			edges[b].push_back(pii(a, t));
			t++;
		}
		else {
			queries[p] = pair<pii, int>(pii(b, a), t);
			p++;
		}
	}
	assert(t == n-1);
	assert(p == k);
	dfs();
	lca_range[0][0] = pii(-1, -1);
	lca_range_rev[0][0] = pii(-1, -1);
	for (int i = 1; i < 20; i++) {
		for (int j = 0; j < n; j++) {
			lca[j][i] = lca[lca[j][i-1]][i-1];
			pii r1 = lca_range[j][i-1];
			pii r2 = lca_range[lca[j][i-1]][i-1];
			if (r1.second >= 0 && r1.second < r2.first) lca_range[j][i] = pii(r1.first, r2.second);
			else lca_range[j][i] = pii(-1, -1);
			r1 = lca_range_rev[j][i-1];
			r2 = lca_range_rev[lca[j][i-1]][i-1];
			if (r2.second >= 0 && r2.second < r1.first) lca_range_rev[j][i] = pii(r2.first, r1.second);
			else lca_range_rev[j][i] = pii(-1, -1);
		}
	}
	for (int i = 0; i < k; i++) {
		if (queries[i].second == -1) {
			cout << spec(i) << "\n";
			continue;
		}
		bool b = calc_lca(queries[i].first.first, queries[i].first.second, queries[i].second);
		if (b) cout << "yes\n";
		else cout << "no\n";
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 4948 KB Output is correct
2 Correct 32 ms 6864 KB Output is correct
3 Correct 30 ms 6972 KB Output is correct
4 Correct 30 ms 6944 KB Output is correct
5 Correct 29 ms 7128 KB Output is correct
6 Correct 31 ms 6952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 4948 KB Output is correct
2 Correct 32 ms 6864 KB Output is correct
3 Correct 30 ms 6972 KB Output is correct
4 Correct 30 ms 6944 KB Output is correct
5 Correct 29 ms 7128 KB Output is correct
6 Correct 31 ms 6952 KB Output is correct
7 Correct 35 ms 5808 KB Output is correct
8 Execution timed out 3574 ms 7660 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 4948 KB Output is correct
2 Correct 162 ms 57268 KB Output is correct
3 Correct 165 ms 57376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 4948 KB Output is correct
2 Correct 162 ms 57268 KB Output is correct
3 Correct 165 ms 57376 KB Output is correct
4 Correct 33 ms 5724 KB Output is correct
5 Execution timed out 3576 ms 59400 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 4896 KB Output is correct
2 Correct 174 ms 63880 KB Output is correct
3 Correct 186 ms 63880 KB Output is correct
4 Correct 166 ms 63904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 4896 KB Output is correct
2 Correct 174 ms 63880 KB Output is correct
3 Correct 186 ms 63880 KB Output is correct
4 Correct 166 ms 63904 KB Output is correct
5 Correct 25 ms 5712 KB Output is correct
6 Execution timed out 3590 ms 66224 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 4936 KB Output is correct
2 Correct 164 ms 57308 KB Output is correct
3 Correct 166 ms 57832 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 4936 KB Output is correct
2 Correct 164 ms 57308 KB Output is correct
3 Correct 166 ms 57832 KB Output is correct
4 Correct 33 ms 5812 KB Output is correct
5 Execution timed out 3589 ms 59736 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 4948 KB Output is correct
2 Correct 169 ms 63884 KB Output is correct
3 Correct 175 ms 63872 KB Output is correct
4 Correct 166 ms 63876 KB Output is correct
5 Correct 25 ms 5116 KB Output is correct
6 Correct 177 ms 57272 KB Output is correct
7 Correct 172 ms 57756 KB Output is correct
8 Correct 172 ms 58192 KB Output is correct
9 Correct 188 ms 58244 KB Output is correct
10 Correct 239 ms 61996 KB Output is correct
11 Correct 219 ms 61388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 4948 KB Output is correct
2 Correct 169 ms 63884 KB Output is correct
3 Correct 175 ms 63872 KB Output is correct
4 Correct 166 ms 63876 KB Output is correct
5 Correct 25 ms 5116 KB Output is correct
6 Correct 177 ms 57272 KB Output is correct
7 Correct 172 ms 57756 KB Output is correct
8 Correct 172 ms 58192 KB Output is correct
9 Correct 188 ms 58244 KB Output is correct
10 Correct 239 ms 61996 KB Output is correct
11 Correct 219 ms 61388 KB Output is correct
12 Correct 30 ms 5844 KB Output is correct
13 Execution timed out 3588 ms 66220 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 4940 KB Output is correct
2 Correct 38 ms 6820 KB Output is correct
3 Correct 32 ms 6912 KB Output is correct
4 Correct 36 ms 7008 KB Output is correct
5 Correct 30 ms 7096 KB Output is correct
6 Correct 30 ms 6924 KB Output is correct
7 Correct 24 ms 5120 KB Output is correct
8 Correct 165 ms 57332 KB Output is correct
9 Correct 158 ms 57280 KB Output is correct
10 Correct 23 ms 5136 KB Output is correct
11 Correct 164 ms 63868 KB Output is correct
12 Correct 163 ms 63840 KB Output is correct
13 Correct 167 ms 63836 KB Output is correct
14 Correct 24 ms 5188 KB Output is correct
15 Correct 162 ms 57280 KB Output is correct
16 Correct 169 ms 57788 KB Output is correct
17 Correct 178 ms 58136 KB Output is correct
18 Correct 176 ms 58172 KB Output is correct
19 Correct 205 ms 61948 KB Output is correct
20 Correct 208 ms 61412 KB Output is correct
21 Correct 168 ms 57328 KB Output is correct
22 Correct 172 ms 57312 KB Output is correct
23 Correct 167 ms 57716 KB Output is correct
24 Correct 161 ms 57800 KB Output is correct
25 Correct 185 ms 58976 KB Output is correct
26 Correct 169 ms 57108 KB Output is correct
27 Correct 166 ms 57092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 4940 KB Output is correct
2 Correct 38 ms 6820 KB Output is correct
3 Correct 32 ms 6912 KB Output is correct
4 Correct 36 ms 7008 KB Output is correct
5 Correct 30 ms 7096 KB Output is correct
6 Correct 30 ms 6924 KB Output is correct
7 Correct 24 ms 5120 KB Output is correct
8 Correct 165 ms 57332 KB Output is correct
9 Correct 158 ms 57280 KB Output is correct
10 Correct 23 ms 5136 KB Output is correct
11 Correct 164 ms 63868 KB Output is correct
12 Correct 163 ms 63840 KB Output is correct
13 Correct 167 ms 63836 KB Output is correct
14 Correct 24 ms 5188 KB Output is correct
15 Correct 162 ms 57280 KB Output is correct
16 Correct 169 ms 57788 KB Output is correct
17 Correct 178 ms 58136 KB Output is correct
18 Correct 176 ms 58172 KB Output is correct
19 Correct 205 ms 61948 KB Output is correct
20 Correct 208 ms 61412 KB Output is correct
21 Correct 168 ms 57328 KB Output is correct
22 Correct 172 ms 57312 KB Output is correct
23 Correct 167 ms 57716 KB Output is correct
24 Correct 161 ms 57800 KB Output is correct
25 Correct 185 ms 58976 KB Output is correct
26 Correct 169 ms 57108 KB Output is correct
27 Correct 166 ms 57092 KB Output is correct
28 Correct 35 ms 5772 KB Output is correct
29 Execution timed out 3579 ms 7584 KB Time limit exceeded
30 Halted 0 ms 0 KB -