답안 #558336

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558336 2022-05-07T06:19:48 Z cheissmart Inside information (BOI21_servers) C++14
62.5 / 100
3500 ms 112704 KB
#include <bits/stdc++.h>
#define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0);
#define F first
#define S second
#define V vector
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(v) int((v).size())
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;

const int INF = 1e9 + 7, N = 120005;

V<pi> G[N];

namespace he {

struct Data {
	bool ok;
	int l, r;
	int mx;
	Data(int _mx = -1) {
		ok = true;
		l = r = mx = _mx;
	}
	friend Data operator + (const Data lhs, const Data rhs) {
		if(lhs.mx == -1) return rhs;
		if(rhs.mx == -1) return lhs;
		Data res;
		res.ok = lhs.ok & rhs.ok & (lhs.r < rhs.l);
		res.l = lhs.l, res.r = rhs.r;
		res.mx = max(lhs.mx, rhs.mx);
		return res;
	}
} up[N][20], down[N][20];

int p[N][20], d[N];

void dfs(int u, int pa = 0) {
	p[u][0] = pa;
	for(int i = 1; i < 20; i++) {
		p[u][i] = p[p[u][i - 1]][i - 1];
		up[u][i] = up[u][i - 1] + up[p[u][i - 1]][i - 1];
		down[u][i] = down[p[u][i - 1]][i - 1] + down[u][i - 1];
	}
	for(auto[v, i]:G[u]) if(v != pa) {
		d[v] = d[u] + 1;
		up[v][0] = down[v][0] = Data(i);
		dfs(v, u);
	}
}

int lca(int u, int v) {
	if(d[u] > d[v]) swap(u, v);
	for(int i = 0; i < 20; i++)
		if((d[v] - d[u]) >> i & 1)
			v = p[v][i];
	if(u == v) return u;
	for(int i = 19; i >= 0; i--)
		if(p[u][i] != p[v][i])
			u = p[u][i], v = p[v][i];
	assert(u != v && p[u][0] == p[v][0]);
	return p[u][0];
}

Data go_up(int u, int step) {
	Data res;
	for(int i = 0; i < 20; i++) if(step >> i & 1)
		res = res + up[u][i], u = p[u][i];
	return res;
}
Data go_down(int u, int step) {
	Data res;
	for(int i = 0; i < 20; i++) if(step >> i & 1)
		res = down[u][i] + res, u = p[u][i];
	return res;
}

}

namespace be {

vi aux[N];
int ans[N * 2], sz[N];
bool vis[N];

void dfs_sz(int u, int p = 0) {
	sz[u] = 1;
	for(auto[v, i] : G[u]) if(v != p && !vis[v]) {
		dfs_sz(v, u);
		sz[u] += sz[v];
	}
}

void dfs_c(int u, int& c, int tot, int p = 0) {
	int mx = tot - sz[u];
	for(auto[v, i] : G[u]) if(v != p && !vis[v]) {
		dfs_c(v, c, tot, u);
		mx = max(mx, sz[v]);
	}
	if(mx * 2 <= tot) c = u;
}

void dfs_down(int u, V<pi>&down, int l, int r, int p) {
	down.EB(l, r);
	for(auto[v, i] : G[u]) if(v != p && !vis[v])
		if(i > r)
			dfs_down(v, down, l, i, u);
}

void dfs_up(int u, V<pi>&up, int l, int r, int p) {
	for(int i:aux[u]) if(i >= r) {
		up.EB(r, i);
		ans[i]++; // to c
	}
	for(auto[v, i] : G[u]) if(v != p && !vis[v])
		if(i < l)
			dfs_up(v, up, i, r, u);
}

void go(V<pi> up, V<pi> down, int op) {
	for(pi p:up) {
		for(pi pp:down) {
			if(p.F <= pp.F && pp.S <= p.S) {
				ans[p.S] += op;
			}
		}
	}
}

void CD(int u) {
	dfs_sz(u);
	int c = -1; dfs_c(u, c, sz[u]);
	V<pi> down_all, up_all;

	for(auto[v, i]:G[c]) if(!vis[v]) {
		V<pi> down;
		dfs_down(v, down, i, i, c);
		V<pi> up;
		dfs_up(v, up, i, i, c);
		go(up, down, -1);

		for(pi p:up) up_all.PB(p);
		for(pi p:down) down_all.PB(p);
	}
	go(up_all, down_all, 1);

	V<pi> upc;
	for(int i:aux[c])
		upc.EB(0, i);

	go(upc, down_all, 1);

	vis[c] = 1;
	for(auto[v, i]:G[c]) if(!vis[v])
		CD(v);

}

}
	
signed main()
{
	IO_OP;

	int n, k;
	cin >> n >> k;
	V<array<int, 3>> qq;
	for(int i = 1; i <= n + k - 1; i++) {
		char op; cin >> op;
		if(op == 'S') {
			int u, v; cin >> u >> v;
			G[u].EB(v, i);
			G[v].EB(u, i);
		} else if(op == 'Q') {
			int u, v; cin >> u >> v;
			qq.PB({u, v, i});
		} else {
			int u; cin >> u;
			qq.PB({u, -1, i});
			be::aux[u].PB(i);
		}
	}
	he::dfs(1);

	be::CD(1);

	for(auto[u, v, i] : qq) {
		if(v != -1) {
			// is the path v -> u increasing?
			if(u == v) {
				cout << "yes\n";
				continue;
			}
			int l = he::lca(u, v);
			auto tt = he::go_up(v, he::d[v] - he::d[l]) + he::go_down(u, he::d[u] - he::d[l]);
			if(tt.mx < i && tt.ok)
				cout << "yes\n";
			else
				cout << "no\n";
		} else {
			cout << be::ans[i] + 1 << '\n';
		}
	}

}


	

Compilation message

servers.cpp: In function 'void he::dfs(int, int)':
servers.cpp:52:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   52 |  for(auto[v, i]:G[u]) if(v != pa) {
      |          ^
servers.cpp: In function 'void be::dfs_sz(int, int)':
servers.cpp:95:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   95 |  for(auto[v, i] : G[u]) if(v != p && !vis[v]) {
      |          ^
servers.cpp: In function 'void be::dfs_c(int, int&, int, int)':
servers.cpp:103:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  103 |  for(auto[v, i] : G[u]) if(v != p && !vis[v]) {
      |          ^
servers.cpp: In function 'void be::dfs_down(int, std::vector<std::pair<int, int> >&, int, int, int)':
servers.cpp:112:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  112 |  for(auto[v, i] : G[u]) if(v != p && !vis[v])
      |          ^
servers.cpp: In function 'void be::dfs_up(int, std::vector<std::pair<int, int> >&, int, int, int)':
servers.cpp:122:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  122 |  for(auto[v, i] : G[u]) if(v != p && !vis[v])
      |          ^
servers.cpp: In function 'void be::CD(int)':
servers.cpp:142:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  142 |  for(auto[v, i]:G[c]) if(!vis[v]) {
      |          ^
servers.cpp:161:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  161 |  for(auto[v, i]:G[c]) if(!vis[v])
      |          ^
servers.cpp: In function 'int main()':
servers.cpp:194:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  194 |  for(auto[u, v, i] : qq) {
      |          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 82980 KB Output is correct
2 Correct 110 ms 83376 KB Output is correct
3 Correct 94 ms 83524 KB Output is correct
4 Correct 113 ms 83492 KB Output is correct
5 Correct 105 ms 84204 KB Output is correct
6 Correct 91 ms 83888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 82980 KB Output is correct
2 Correct 110 ms 83376 KB Output is correct
3 Correct 94 ms 83524 KB Output is correct
4 Correct 113 ms 83492 KB Output is correct
5 Correct 105 ms 84204 KB Output is correct
6 Correct 91 ms 83888 KB Output is correct
7 Correct 81 ms 83652 KB Output is correct
8 Correct 107 ms 84408 KB Output is correct
9 Correct 206 ms 84892 KB Output is correct
10 Correct 112 ms 84604 KB Output is correct
11 Correct 99 ms 84868 KB Output is correct
12 Correct 524 ms 85444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 83704 KB Output is correct
2 Correct 248 ms 100396 KB Output is correct
3 Correct 280 ms 100372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 83704 KB Output is correct
2 Correct 248 ms 100396 KB Output is correct
3 Correct 280 ms 100372 KB Output is correct
4 Correct 88 ms 83440 KB Output is correct
5 Correct 3240 ms 101828 KB Output is correct
6 Execution timed out 3580 ms 102276 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 83756 KB Output is correct
2 Correct 381 ms 109144 KB Output is correct
3 Correct 425 ms 109116 KB Output is correct
4 Correct 421 ms 110740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 83756 KB Output is correct
2 Correct 381 ms 109144 KB Output is correct
3 Correct 425 ms 109116 KB Output is correct
4 Correct 421 ms 110740 KB Output is correct
5 Correct 78 ms 83964 KB Output is correct
6 Correct 457 ms 110976 KB Output is correct
7 Execution timed out 3567 ms 112108 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 83680 KB Output is correct
2 Correct 377 ms 100400 KB Output is correct
3 Correct 334 ms 99256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 83680 KB Output is correct
2 Correct 377 ms 100400 KB Output is correct
3 Correct 334 ms 99256 KB Output is correct
4 Correct 82 ms 83788 KB Output is correct
5 Correct 3462 ms 102520 KB Output is correct
6 Correct 315 ms 100444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 83536 KB Output is correct
2 Correct 353 ms 108924 KB Output is correct
3 Correct 379 ms 108988 KB Output is correct
4 Correct 320 ms 110296 KB Output is correct
5 Correct 75 ms 83528 KB Output is correct
6 Correct 340 ms 100044 KB Output is correct
7 Correct 304 ms 99072 KB Output is correct
8 Correct 468 ms 99448 KB Output is correct
9 Correct 323 ms 99464 KB Output is correct
10 Correct 466 ms 105008 KB Output is correct
11 Correct 526 ms 104288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 83536 KB Output is correct
2 Correct 353 ms 108924 KB Output is correct
3 Correct 379 ms 108988 KB Output is correct
4 Correct 320 ms 110296 KB Output is correct
5 Correct 75 ms 83528 KB Output is correct
6 Correct 340 ms 100044 KB Output is correct
7 Correct 304 ms 99072 KB Output is correct
8 Correct 468 ms 99448 KB Output is correct
9 Correct 323 ms 99464 KB Output is correct
10 Correct 466 ms 105008 KB Output is correct
11 Correct 526 ms 104288 KB Output is correct
12 Correct 74 ms 83648 KB Output is correct
13 Correct 426 ms 110928 KB Output is correct
14 Correct 3496 ms 112704 KB Output is correct
15 Correct 442 ms 111740 KB Output is correct
16 Correct 467 ms 111632 KB Output is correct
17 Correct 81 ms 83424 KB Output is correct
18 Correct 3173 ms 102484 KB Output is correct
19 Correct 299 ms 100528 KB Output is correct
20 Correct 405 ms 101508 KB Output is correct
21 Correct 333 ms 101596 KB Output is correct
22 Correct 1197 ms 105968 KB Output is correct
23 Execution timed out 3566 ms 106236 KB Time limit exceeded
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 83488 KB Output is correct
2 Correct 115 ms 83920 KB Output is correct
3 Correct 93 ms 84048 KB Output is correct
4 Correct 116 ms 84044 KB Output is correct
5 Correct 93 ms 84288 KB Output is correct
6 Correct 84 ms 83968 KB Output is correct
7 Correct 79 ms 83520 KB Output is correct
8 Correct 223 ms 100024 KB Output is correct
9 Correct 273 ms 100032 KB Output is correct
10 Correct 76 ms 83536 KB Output is correct
11 Correct 331 ms 108852 KB Output is correct
12 Correct 414 ms 108924 KB Output is correct
13 Correct 315 ms 110348 KB Output is correct
14 Correct 106 ms 83428 KB Output is correct
15 Correct 291 ms 100052 KB Output is correct
16 Correct 279 ms 98996 KB Output is correct
17 Correct 401 ms 99360 KB Output is correct
18 Correct 316 ms 99516 KB Output is correct
19 Correct 366 ms 104992 KB Output is correct
20 Correct 446 ms 104296 KB Output is correct
21 Correct 223 ms 100100 KB Output is correct
22 Correct 231 ms 99628 KB Output is correct
23 Correct 262 ms 99128 KB Output is correct
24 Correct 265 ms 99168 KB Output is correct
25 Correct 364 ms 103756 KB Output is correct
26 Correct 307 ms 98368 KB Output is correct
27 Correct 306 ms 98484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 83488 KB Output is correct
2 Correct 115 ms 83920 KB Output is correct
3 Correct 93 ms 84048 KB Output is correct
4 Correct 116 ms 84044 KB Output is correct
5 Correct 93 ms 84288 KB Output is correct
6 Correct 84 ms 83968 KB Output is correct
7 Correct 79 ms 83520 KB Output is correct
8 Correct 223 ms 100024 KB Output is correct
9 Correct 273 ms 100032 KB Output is correct
10 Correct 76 ms 83536 KB Output is correct
11 Correct 331 ms 108852 KB Output is correct
12 Correct 414 ms 108924 KB Output is correct
13 Correct 315 ms 110348 KB Output is correct
14 Correct 106 ms 83428 KB Output is correct
15 Correct 291 ms 100052 KB Output is correct
16 Correct 279 ms 98996 KB Output is correct
17 Correct 401 ms 99360 KB Output is correct
18 Correct 316 ms 99516 KB Output is correct
19 Correct 366 ms 104992 KB Output is correct
20 Correct 446 ms 104296 KB Output is correct
21 Correct 223 ms 100100 KB Output is correct
22 Correct 231 ms 99628 KB Output is correct
23 Correct 262 ms 99128 KB Output is correct
24 Correct 265 ms 99168 KB Output is correct
25 Correct 364 ms 103756 KB Output is correct
26 Correct 307 ms 98368 KB Output is correct
27 Correct 306 ms 98484 KB Output is correct
28 Correct 79 ms 83808 KB Output is correct
29 Correct 95 ms 84492 KB Output is correct
30 Correct 188 ms 85064 KB Output is correct
31 Correct 99 ms 84572 KB Output is correct
32 Correct 90 ms 84944 KB Output is correct
33 Correct 455 ms 85564 KB Output is correct
34 Correct 78 ms 83540 KB Output is correct
35 Correct 2734 ms 101832 KB Output is correct
36 Execution timed out 3579 ms 102440 KB Time limit exceeded
37 Halted 0 ms 0 KB -