답안 #910162

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
910162 2024-01-18T00:47:29 Z MinaRagy06 Inside information (BOI21_servers) C++17
70 / 100
3500 ms 88436 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];
	int j = (par == SZ(adj[i])? 0 : par + 1);
	dp[i][par] = 1;
	if (j < SZ(adj[i])) {
		if (adj[i][j][1] > lst) return dp[i][par];
		dp[i][par] += solve(adj[i][j][0], adj[i][j][2]) + solve(i, j) - 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 = 300;
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)) {
					array<int, 2> val = check(0, x, b);
					ans += val[0] <= t - 1;
				} 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\n";
#endif
	return 0;
}

Compilation message

servers.cpp: In function 'int main()':
servers.cpp:90:7: warning: unused variable 'S' [-Wunused-variable]
   90 |  auto S = chrono::steady_clock::now().time_since_epoch().count();
      |       ^
servers.cpp:123:5: warning: unused variable 's' [-Wunused-variable]
  123 |  ll s = 0;
      |     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16328 KB Output is correct
2 Correct 35 ms 18752 KB Output is correct
3 Correct 41 ms 19028 KB Output is correct
4 Correct 45 ms 19024 KB Output is correct
5 Correct 34 ms 19048 KB Output is correct
6 Correct 53 ms 19028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16328 KB Output is correct
2 Correct 35 ms 18752 KB Output is correct
3 Correct 41 ms 19028 KB Output is correct
4 Correct 45 ms 19024 KB Output is correct
5 Correct 34 ms 19048 KB Output is correct
6 Correct 53 ms 19028 KB Output is correct
7 Correct 42 ms 16328 KB Output is correct
8 Correct 172 ms 18904 KB Output is correct
9 Correct 358 ms 18968 KB Output is correct
10 Correct 183 ms 18760 KB Output is correct
11 Correct 87 ms 18836 KB Output is correct
12 Correct 255 ms 19128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 16212 KB Output is correct
2 Correct 386 ms 82744 KB Output is correct
3 Correct 343 ms 82444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 16212 KB Output is correct
2 Correct 386 ms 82744 KB Output is correct
3 Correct 343 ms 82444 KB Output is correct
4 Correct 41 ms 16220 KB Output is correct
5 Correct 2340 ms 88416 KB Output is correct
6 Correct 2466 ms 88436 KB Output is correct
7 Correct 2985 ms 88296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 16248 KB Output is correct
2 Correct 393 ms 86392 KB Output is correct
3 Correct 376 ms 86356 KB Output is correct
4 Correct 445 ms 86352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 16248 KB Output is correct
2 Correct 393 ms 86392 KB Output is correct
3 Correct 376 ms 86356 KB Output is correct
4 Correct 445 ms 86352 KB Output is correct
5 Correct 37 ms 16208 KB Output is correct
6 Correct 460 ms 86064 KB Output is correct
7 Correct 1520 ms 86488 KB Output is correct
8 Correct 619 ms 86100 KB Output is correct
9 Correct 589 ms 86176 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 16320 KB Output is correct
2 Correct 336 ms 82324 KB Output is correct
3 Correct 422 ms 82492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 16320 KB Output is correct
2 Correct 336 ms 82324 KB Output is correct
3 Correct 422 ms 82492 KB Output is correct
4 Correct 57 ms 16212 KB Output is correct
5 Correct 1386 ms 82804 KB Output is correct
6 Correct 691 ms 82516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 16220 KB Output is correct
2 Correct 560 ms 86364 KB Output is correct
3 Correct 410 ms 86200 KB Output is correct
4 Correct 501 ms 86100 KB Output is correct
5 Correct 29 ms 16212 KB Output is correct
6 Correct 340 ms 82512 KB Output is correct
7 Correct 395 ms 82424 KB Output is correct
8 Correct 414 ms 82832 KB Output is correct
9 Correct 425 ms 82980 KB Output is correct
10 Correct 668 ms 84860 KB Output is correct
11 Correct 666 ms 84504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 16220 KB Output is correct
2 Correct 560 ms 86364 KB Output is correct
3 Correct 410 ms 86200 KB Output is correct
4 Correct 501 ms 86100 KB Output is correct
5 Correct 29 ms 16212 KB Output is correct
6 Correct 340 ms 82512 KB Output is correct
7 Correct 395 ms 82424 KB Output is correct
8 Correct 414 ms 82832 KB Output is correct
9 Correct 425 ms 82980 KB Output is correct
10 Correct 668 ms 84860 KB Output is correct
11 Correct 666 ms 84504 KB Output is correct
12 Correct 34 ms 16140 KB Output is correct
13 Correct 551 ms 86276 KB Output is correct
14 Correct 1507 ms 86352 KB Output is correct
15 Correct 606 ms 86172 KB Output is correct
16 Correct 623 ms 86100 KB Output is correct
17 Correct 39 ms 16208 KB Output is correct
18 Correct 1172 ms 82508 KB Output is correct
19 Correct 511 ms 82308 KB Output is correct
20 Correct 639 ms 82880 KB Output is correct
21 Correct 577 ms 83240 KB Output is correct
22 Correct 2476 ms 84056 KB Output is correct
23 Execution timed out 3555 ms 84888 KB Time limit exceeded
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 35 ms 16220 KB Output is correct
2 Correct 35 ms 18812 KB Output is correct
3 Correct 41 ms 19028 KB Output is correct
4 Correct 38 ms 18816 KB Output is correct
5 Correct 35 ms 19024 KB Output is correct
6 Correct 44 ms 19028 KB Output is correct
7 Correct 33 ms 16216 KB Output is correct
8 Correct 376 ms 82440 KB Output is correct
9 Correct 353 ms 82528 KB Output is correct
10 Correct 28 ms 16328 KB Output is correct
11 Correct 337 ms 86300 KB Output is correct
12 Correct 373 ms 86556 KB Output is correct
13 Correct 394 ms 86160 KB Output is correct
14 Correct 28 ms 16220 KB Output is correct
15 Correct 325 ms 82780 KB Output is correct
16 Correct 367 ms 82584 KB Output is correct
17 Correct 367 ms 83296 KB Output is correct
18 Correct 399 ms 83012 KB Output is correct
19 Correct 627 ms 84900 KB Output is correct
20 Correct 643 ms 84180 KB Output is correct
21 Correct 352 ms 82512 KB Output is correct
22 Correct 362 ms 82768 KB Output is correct
23 Correct 393 ms 83120 KB Output is correct
24 Correct 381 ms 83260 KB Output is correct
25 Correct 391 ms 83176 KB Output is correct
26 Correct 475 ms 82000 KB Output is correct
27 Correct 439 ms 81988 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 35 ms 16220 KB Output is correct
2 Correct 35 ms 18812 KB Output is correct
3 Correct 41 ms 19028 KB Output is correct
4 Correct 38 ms 18816 KB Output is correct
5 Correct 35 ms 19024 KB Output is correct
6 Correct 44 ms 19028 KB Output is correct
7 Correct 33 ms 16216 KB Output is correct
8 Correct 376 ms 82440 KB Output is correct
9 Correct 353 ms 82528 KB Output is correct
10 Correct 28 ms 16328 KB Output is correct
11 Correct 337 ms 86300 KB Output is correct
12 Correct 373 ms 86556 KB Output is correct
13 Correct 394 ms 86160 KB Output is correct
14 Correct 28 ms 16220 KB Output is correct
15 Correct 325 ms 82780 KB Output is correct
16 Correct 367 ms 82584 KB Output is correct
17 Correct 367 ms 83296 KB Output is correct
18 Correct 399 ms 83012 KB Output is correct
19 Correct 627 ms 84900 KB Output is correct
20 Correct 643 ms 84180 KB Output is correct
21 Correct 352 ms 82512 KB Output is correct
22 Correct 362 ms 82768 KB Output is correct
23 Correct 393 ms 83120 KB Output is correct
24 Correct 381 ms 83260 KB Output is correct
25 Correct 391 ms 83176 KB Output is correct
26 Correct 475 ms 82000 KB Output is correct
27 Correct 439 ms 81988 KB Output is correct
28 Correct 46 ms 16208 KB Output is correct
29 Correct 160 ms 18900 KB Output is correct
30 Correct 346 ms 19024 KB Output is correct
31 Correct 177 ms 18900 KB Output is correct
32 Correct 92 ms 18856 KB Output is correct
33 Correct 247 ms 19296 KB Output is correct
34 Correct 42 ms 16264 KB Output is correct
35 Correct 1345 ms 87924 KB Output is correct
36 Correct 1370 ms 88356 KB Output is correct
37 Correct 1585 ms 88216 KB Output is correct
38 Correct 30 ms 16208 KB Output is correct
39 Correct 465 ms 86892 KB Output is correct
40 Correct 1351 ms 86624 KB Output is correct
41 Correct 542 ms 86420 KB Output is correct
42 Correct 542 ms 86100 KB Output is correct
43 Correct 38 ms 16220 KB Output is correct
44 Correct 1157 ms 82700 KB Output is correct
45 Correct 502 ms 82772 KB Output is correct
46 Correct 573 ms 82920 KB Output is correct
47 Correct 546 ms 82928 KB Output is correct
48 Correct 2309 ms 83908 KB Output is correct
49 Execution timed out 3583 ms 85144 KB Time limit exceeded
50 Halted 0 ms 0 KB -