답안 #910145

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
910145 2024-01-18T00:14:49 Z MinaRagy06 Inside information (BOI21_servers) C++17
70 / 100
3500 ms 87160 KB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
typedef int64_t ll;
#define SZ(x) (int) x.size()

const int N = 120'005;
vector<array<int, 3>> adj[N];
//0: increasing, 1: decreasing, {ancestor, last weight}
array<int, 3> bl[N][18][2];
int st[N], en[N], curt;
void dfs(int i, int par, int part) {
	bl[i][0][0] = {par, part, part};
	bl[i][0][1] = {par, part, part};
	for (int j = 1; j < 18; j++) {
		{
			bl[i][j][0] = bl[i][j - 1][0];
			auto [lst, lstt, mx] = bl[i][j][0];
			if (lstt <= bl[lst][0][0][1]) {
				bl[i][j][0] = bl[lst][j - 1][0];
				bl[i][j][0][2] = max(bl[i][j][0][2], mx);
			}
		}
		{
			bl[i][j][1] = bl[i][j - 1][1];
			auto [lst, lstt, mx] = bl[i][j][1];
			if (lstt >= bl[lst][0][1][1]) {
				bl[i][j][1] = bl[lst][j - 1][1];
				bl[i][j][1][2] = max(bl[i][j][1][2], mx);
			}
		}
	}
	st[i] = curt++;
	for (auto [nxt, t, nxtidx] : adj[i]) {
		if (nxt == par) continue;
		dfs(nxt, i, t);
	}
	en[i] = curt;
}
bool isanc(int l, int b) {
	if (st[l] <= st[b] && en[b] <= en[l]) {
		return 1;
	}
	return 0;
}
array<int, 2> check(int t, int a, int b) {
	int mx = -1e9, high = bl[a][17][t][0];
	if (!isanc(high, b)) {
		return {int(1e9), 0};
	}
	if (a == high || isanc(a, b)) {
		return {int(-1e9), (t == 1? 1 : -1) * int(1e9)};
	}
	for (int j = 17; j >= 0; j--) {
		if (!isanc(bl[a][j][t][0], b)) {
			mx = max(mx, bl[a][j][t][2]);
			a = bl[a][j][t][0];
		}
	}
	return {max(mx, bl[a][0][t][2]), bl[a][0][t][1]};
}
vector<int> dp[N];
int lst;
int solve(int i, int par) {
	if (~dp[i][par]) return dp[i][par];
	dp[i][par] = 1;
	for (int j = (par == SZ(adj[i])? 0 : par + 1); j < SZ(adj[i]); j++) {
		auto [nxt, t, nxtidx] = adj[i][j];
		if (t > lst) break;
		dp[i][par] += solve(nxt, nxtidx);
	}
	return dp[i][par];
}
bool checkpath(int a, int b, int t, bool x) {
	array<int, 2> l = check(x, a, b), r = check(!x, b, a);
	if (l[0] <= t && r[0] <= t && (l[1] == r[1] || (x ^ (l[1] < r[1]))) ) {
		return 1;
	} else {
		return 0;
	}
}
const int B = 280;
int main() {
	ios_base::sync_with_stdio(0), cin.tie(0);
	auto S = chrono::steady_clock::now().time_since_epoch().count();
	int n, q;
	cin >> n >> q;
	q += n - 1;
	pair<char, vector<int>> v[q];
	for (int i = 0; i < q; i++) {
		cin >> v[i].first;
		if (v[i].first == 'S') {
			int a, b;
			cin >> a >> b;
			int x = adj[b].size(), y = adj[a].size();
			adj[a].push_back({b, i, x});
			adj[b].push_back({a, i, y});
			v[i].second = {a, b};
		} else if (v[i].first == 'Q') {
			int a, b;
			cin >> a >> b;
			v[i].second = {a, b};
		} else {
			int a;
			cin >> a;
			v[i].second = {a};
		}
	}
	dfs(1, 1, 0);
	for (int i = 1; i <= n; i++) {
		dp[i].resize(adj[i].size() + 1);
		for (int j = 0; j <= SZ(adj[i]); j++) {
			dp[i][j] = -1;
		}
	}
	vector<array<int, 3>> upd;
	lst = -1;
	ll s = 0;
	for (int i = 0; i < q; i++) {
		if (upd.size() == B) {
// 			for (auto [a, b, t] : upd) {
// 				int x = curadj[b].size(), y = curadj[a].size();
// 				curadj[a].push_back({b, t, x});
// 				curadj[b].push_back({a, t, y});
// 			}
			lst = i - 1;
			upd.clear();
			for (int i = 1; i <= n; i++) {
				for (int j = 0; j <= SZ(adj[i]); j++) {
					dp[i][j] = -1;
				}
			}
		}
		if (v[i].first == 'S') {
			int a = v[i].second[0], b = v[i].second[1];
			if (isanc(b, a)) swap(a, b);
			upd.push_back({a, b, i});
		} else if (v[i].first == 'Q') {
			int a = v[i].second[0], b = v[i].second[1];
#ifdef MINA
// 			cout << i << endl;
			s += (checkpath(a, b, i, 1));
#else
			cout << (checkpath(a, b, i, 1)? "yes\n" : "no\n");
#endif
		} else {
			int x = v[i].second[0];
			int ans = solve(x, adj[x].size());
			for (auto [a, b, t] : upd) {
				if (isanc(b, x)) {
					ans += checkpath(x, b, t - 1, 0);
				} else {
					ans += checkpath(x, a, t - 1, 0);
				}
			}
#ifdef MINA
// 			cout << i << endl;
			s += ans;
#else
			cout << ans << '\n';
#endif
		}
	}
#ifdef MINA
	cout << s << '\n';
	auto E = chrono::steady_clock::now().time_since_epoch().count();
	cout << (E - S) / 1e9 << 's';
#endif
	return 0;
}

Compilation message

servers.cpp: In function 'int main()':
servers.cpp:85:7: warning: unused variable 'S' [-Wunused-variable]
   85 |  auto S = chrono::steady_clock::now().time_since_epoch().count();
      |       ^
servers.cpp:118:5: warning: unused variable 's' [-Wunused-variable]
  118 |  ll s = 0;
      |     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 16220 KB Output is correct
2 Correct 37 ms 19024 KB Output is correct
3 Correct 40 ms 19072 KB Output is correct
4 Correct 37 ms 18868 KB Output is correct
5 Correct 32 ms 19020 KB Output is correct
6 Correct 40 ms 19028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 16220 KB Output is correct
2 Correct 37 ms 19024 KB Output is correct
3 Correct 40 ms 19072 KB Output is correct
4 Correct 37 ms 18868 KB Output is correct
5 Correct 32 ms 19020 KB Output is correct
6 Correct 40 ms 19028 KB Output is correct
7 Correct 40 ms 16288 KB Output is correct
8 Correct 147 ms 18816 KB Output is correct
9 Correct 303 ms 19028 KB Output is correct
10 Correct 158 ms 19280 KB Output is correct
11 Correct 78 ms 19028 KB Output is correct
12 Correct 205 ms 19024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 16280 KB Output is correct
2 Correct 395 ms 82796 KB Output is correct
3 Correct 383 ms 82692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 16280 KB Output is correct
2 Correct 395 ms 82796 KB Output is correct
3 Correct 383 ms 82692 KB Output is correct
4 Correct 39 ms 16464 KB Output is correct
5 Correct 1784 ms 82628 KB Output is correct
6 Correct 859 ms 82660 KB Output is correct
7 Correct 1130 ms 82676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 16236 KB Output is correct
2 Correct 372 ms 86284 KB Output is correct
3 Correct 360 ms 86360 KB Output is correct
4 Correct 407 ms 86308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 16236 KB Output is correct
2 Correct 372 ms 86284 KB Output is correct
3 Correct 360 ms 86360 KB Output is correct
4 Correct 407 ms 86308 KB Output is correct
5 Correct 28 ms 16208 KB Output is correct
6 Correct 496 ms 86260 KB Output is correct
7 Correct 1434 ms 87060 KB Output is correct
8 Correct 568 ms 86092 KB Output is correct
9 Correct 586 ms 86064 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 16188 KB Output is correct
2 Correct 331 ms 82560 KB Output is correct
3 Correct 377 ms 82400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 16188 KB Output is correct
2 Correct 331 ms 82560 KB Output is correct
3 Correct 377 ms 82400 KB Output is correct
4 Correct 45 ms 16360 KB Output is correct
5 Correct 887 ms 82612 KB Output is correct
6 Correct 489 ms 82436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 16220 KB Output is correct
2 Correct 356 ms 86380 KB Output is correct
3 Correct 353 ms 86612 KB Output is correct
4 Correct 419 ms 86232 KB Output is correct
5 Correct 26 ms 16220 KB Output is correct
6 Correct 331 ms 82504 KB Output is correct
7 Correct 372 ms 82512 KB Output is correct
8 Correct 380 ms 82952 KB Output is correct
9 Correct 434 ms 83028 KB Output is correct
10 Correct 658 ms 84756 KB Output is correct
11 Correct 645 ms 84128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 16220 KB Output is correct
2 Correct 356 ms 86380 KB Output is correct
3 Correct 353 ms 86612 KB Output is correct
4 Correct 419 ms 86232 KB Output is correct
5 Correct 26 ms 16220 KB Output is correct
6 Correct 331 ms 82504 KB Output is correct
7 Correct 372 ms 82512 KB Output is correct
8 Correct 380 ms 82952 KB Output is correct
9 Correct 434 ms 83028 KB Output is correct
10 Correct 658 ms 84756 KB Output is correct
11 Correct 645 ms 84128 KB Output is correct
12 Correct 29 ms 16216 KB Output is correct
13 Correct 497 ms 86468 KB Output is correct
14 Correct 1446 ms 86976 KB Output is correct
15 Correct 549 ms 86096 KB Output is correct
16 Correct 612 ms 86152 KB Output is correct
17 Correct 47 ms 16124 KB Output is correct
18 Correct 873 ms 82360 KB Output is correct
19 Correct 549 ms 82496 KB Output is correct
20 Correct 539 ms 82952 KB Output is correct
21 Correct 565 ms 83212 KB Output is correct
22 Correct 2416 ms 84572 KB Output is correct
23 Execution timed out 3553 ms 85212 KB Time limit exceeded
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 16220 KB Output is correct
2 Correct 33 ms 18780 KB Output is correct
3 Correct 39 ms 19028 KB Output is correct
4 Correct 35 ms 19024 KB Output is correct
5 Correct 35 ms 19028 KB Output is correct
6 Correct 51 ms 19024 KB Output is correct
7 Correct 31 ms 16220 KB Output is correct
8 Correct 383 ms 82548 KB Output is correct
9 Correct 381 ms 82436 KB Output is correct
10 Correct 25 ms 16208 KB Output is correct
11 Correct 390 ms 86440 KB Output is correct
12 Correct 365 ms 86356 KB Output is correct
13 Correct 420 ms 86280 KB Output is correct
14 Correct 28 ms 16220 KB Output is correct
15 Correct 334 ms 82772 KB Output is correct
16 Correct 373 ms 82516 KB Output is correct
17 Correct 373 ms 82964 KB Output is correct
18 Correct 427 ms 83020 KB Output is correct
19 Correct 669 ms 84608 KB Output is correct
20 Correct 661 ms 84200 KB Output is correct
21 Correct 429 ms 82364 KB Output is correct
22 Correct 387 ms 82492 KB Output is correct
23 Correct 439 ms 83288 KB Output is correct
24 Correct 399 ms 83096 KB Output is correct
25 Correct 416 ms 83244 KB Output is correct
26 Correct 512 ms 82004 KB Output is correct
27 Correct 449 ms 82000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 16220 KB Output is correct
2 Correct 33 ms 18780 KB Output is correct
3 Correct 39 ms 19028 KB Output is correct
4 Correct 35 ms 19024 KB Output is correct
5 Correct 35 ms 19028 KB Output is correct
6 Correct 51 ms 19024 KB Output is correct
7 Correct 31 ms 16220 KB Output is correct
8 Correct 383 ms 82548 KB Output is correct
9 Correct 381 ms 82436 KB Output is correct
10 Correct 25 ms 16208 KB Output is correct
11 Correct 390 ms 86440 KB Output is correct
12 Correct 365 ms 86356 KB Output is correct
13 Correct 420 ms 86280 KB Output is correct
14 Correct 28 ms 16220 KB Output is correct
15 Correct 334 ms 82772 KB Output is correct
16 Correct 373 ms 82516 KB Output is correct
17 Correct 373 ms 82964 KB Output is correct
18 Correct 427 ms 83020 KB Output is correct
19 Correct 669 ms 84608 KB Output is correct
20 Correct 661 ms 84200 KB Output is correct
21 Correct 429 ms 82364 KB Output is correct
22 Correct 387 ms 82492 KB Output is correct
23 Correct 439 ms 83288 KB Output is correct
24 Correct 399 ms 83096 KB Output is correct
25 Correct 416 ms 83244 KB Output is correct
26 Correct 512 ms 82004 KB Output is correct
27 Correct 449 ms 82000 KB Output is correct
28 Correct 40 ms 16208 KB Output is correct
29 Correct 153 ms 18788 KB Output is correct
30 Correct 305 ms 19028 KB Output is correct
31 Correct 155 ms 18744 KB Output is correct
32 Correct 74 ms 19028 KB Output is correct
33 Correct 203 ms 18972 KB Output is correct
34 Correct 40 ms 16380 KB Output is correct
35 Correct 1830 ms 82652 KB Output is correct
36 Correct 869 ms 82964 KB Output is correct
37 Correct 1029 ms 82548 KB Output is correct
38 Correct 31 ms 16436 KB Output is correct
39 Correct 490 ms 86272 KB Output is correct
40 Correct 1501 ms 87160 KB Output is correct
41 Correct 585 ms 86100 KB Output is correct
42 Correct 566 ms 86100 KB Output is correct
43 Correct 36 ms 16220 KB Output is correct
44 Correct 908 ms 82800 KB Output is correct
45 Correct 483 ms 82288 KB Output is correct
46 Correct 514 ms 83040 KB Output is correct
47 Correct 561 ms 82972 KB Output is correct
48 Correct 2430 ms 84732 KB Output is correct
49 Execution timed out 3556 ms 85468 KB Time limit exceeded
50 Halted 0 ms 0 KB -