답안 #910158

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
910158 2024-01-18T00:43:36 Z MinaRagy06 Inside information (BOI21_servers) C++17
5 / 100
3500 ms 88308 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 = 3;
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';
#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 16988 KB Output is correct
2 Correct 63 ms 20340 KB Output is correct
3 Correct 58 ms 20128 KB Output is correct
4 Correct 72 ms 20048 KB Output is correct
5 Correct 53 ms 20136 KB Output is correct
6 Correct 59 ms 20048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16988 KB Output is correct
2 Correct 63 ms 20340 KB Output is correct
3 Correct 58 ms 20128 KB Output is correct
4 Correct 72 ms 20048 KB Output is correct
5 Correct 53 ms 20136 KB Output is correct
6 Correct 59 ms 20048 KB Output is correct
7 Correct 31 ms 17112 KB Output is correct
8 Correct 65 ms 19580 KB Output is correct
9 Correct 80 ms 19796 KB Output is correct
10 Correct 76 ms 19536 KB Output is correct
11 Correct 51 ms 19596 KB Output is correct
12 Correct 90 ms 19808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 17044 KB Output is correct
2 Execution timed out 3537 ms 83992 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 17044 KB Output is correct
2 Execution timed out 3537 ms 83992 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16976 KB Output is correct
2 Execution timed out 3541 ms 88212 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16976 KB Output is correct
2 Execution timed out 3541 ms 88212 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 16976 KB Output is correct
2 Execution timed out 3533 ms 84496 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 16976 KB Output is correct
2 Execution timed out 3533 ms 84496 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 16976 KB Output is correct
2 Execution timed out 3523 ms 88308 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 16976 KB Output is correct
2 Execution timed out 3523 ms 88308 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16216 KB Output is correct
2 Correct 64 ms 18920 KB Output is correct
3 Correct 58 ms 18936 KB Output is correct
4 Correct 67 ms 18992 KB Output is correct
5 Correct 50 ms 19028 KB Output is correct
6 Correct 58 ms 19028 KB Output is correct
7 Correct 39 ms 16212 KB Output is correct
8 Execution timed out 3574 ms 82724 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 16216 KB Output is correct
2 Correct 64 ms 18920 KB Output is correct
3 Correct 58 ms 18936 KB Output is correct
4 Correct 67 ms 18992 KB Output is correct
5 Correct 50 ms 19028 KB Output is correct
6 Correct 58 ms 19028 KB Output is correct
7 Correct 39 ms 16212 KB Output is correct
8 Execution timed out 3574 ms 82724 KB Time limit exceeded
9 Halted 0 ms 0 KB -