답안 #771941

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
771941 2023-07-03T12:29:52 Z LittleCube Inside information (BOI21_servers) C++17
100 / 100
1008 ms 93768 KB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define piii tuple<int, int, int>
#define F first
#define S second
using namespace std;

int N, K, pre[120005][20], vis[120005], sz[120005], head[120005][20], ts;
pii io[120005], bin[120005][20], e[120005];
piii Q[120005];
vector<piii> update[120005];
vector<pii> E[120005];

struct BIT
{
	vector<int> bit;
	vector<int> vals;
	int id(int i, int p = 0)
	{
		return max(0, (int)(lower_bound(vals.begin(), vals.end(), i, greater<>()) - vals.begin()) + p);
	}
	void init(vector<int> val)
	{
		val.emplace_back(N + 8);
		val.emplace_back(N);
		val.emplace_back(-7);
		val.emplace_back(-8);
		sort(val.begin(), val.end(), greater<>());
		vals = val;
		bit.resize(vals.size(), 0);
	}
	int query(int k, int p)
	{
		int ans = 0;
		for (int i = id(k, p); i; i -= (i & -i))
			ans += bit[i];
		return ans;
	}
	void modify(int k)
	{
		for (int i = id(k); i < (int)bit.size(); i += (i & -i))
			bit[i]++;
	}
} bit[120005];

void calcsz(int u)
{
	vis[u] = sz[u] = 1;
	for (auto [v, w] : E[u])
		if (!vis[v])
		{
			calcsz(v);
			sz[u] += sz[v];
		}
	vis[u] = 0;
}

void init(int u, int p, int t, int c, int l)
{
	head[u][l] = c;
	if (p < N)
		update[p].emplace_back(piii(c, l, t));
	vis[u] = 1;
	for (auto [v, w] : E[u])
		if (!vis[v])
			init(v, (p < w ? w : N), t, c, l);
	vis[u] = 0;
}

void cdec(int r, int l)
{
	int c = r;
	calcsz(r);
	{
		int u = r;
		do
		{
			c = u;
			for (auto [v, _] : E[u])
				if (sz[u] > sz[v] && sz[v] > sz[r] / 2)
				{
					u = v;
					break;
				}
		} while (u != c);
	}
	vector<int> v;
	head[c][l] = c;
	vis[c] = 1;
	for (auto [u, w] : E[c])
		if (!vis[u])
		{
			v.emplace_back(w);
			init(u, w, w, c, l);
		}
	bit[c].init(v);
	bit[c].modify(N);
	for (auto [u, w] : E[c])
		if (!vis[u])
			cdec(u, l + 1);
}

const pii no = {-8, -8},
		  bad = {-2, -2};
pii merge(pii p, pii q)
{
	if (p == no)
		return q;
	if (q == no)
		return p;
	if (p == bad || q == bad)
		return bad;
	if (p.F <= p.S && p.S <= q.F && q.F <= q.S)
		return pii(p.F, q.S);
	if (p.F >= p.S && p.S >= q.F && q.F >= q.S)
		return pii(p.F, q.S);
	return bad;
}

void dfs(int u)
{
	io[u].F = ++ts;
	for (auto [v, w] : E[u])
		if (v != pre[u][0])
		{
			pre[v][0] = u;
			bin[v][0] = pii(w, w);
			for (int p = 0; p + 1 < 20; p++)
				pre[v][p + 1] = pre[pre[v][p]][p],
						   bin[v][p + 1] = merge(bin[v][p], bin[pre[v][p]][p]);
			dfs(v);
		}
	io[u].S = ts;
}

bool ischild(int r, int c)
{
	return io[r].F <= io[c].F && io[c].S <= io[r].S;
}

pii getpath(int u, int v)
{
	pii l = no, r = no;

	for (int p = 19; p >= 0; p--)
		if (!ischild(pre[u][p], v))
			l = merge(l, bin[u][p]), u = pre[u][p];
	if (!ischild(u, v))
		l = merge(l, bin[u][0]), u = pre[u][0];

	for (int p = 19; p >= 0; p--)
		if (!ischild(pre[v][p], u))
			r = merge(r, bin[v][p]), v = pre[v][p];
	if (!ischild(v, u))
		r = merge(r, bin[v][0]), v = pre[v][0];

	swap(r.F, r.S);

	return merge(l, r);
}

signed main()
{
	cin >> N >> K;
	for (int i = 0, j = 0; i + j < K + N - 1;)
	{
		char c;
		int a, b = 0;
		cin >> c >> a;
		if (c != 'C')
			cin >> b;

		if (c == 'S')
		{
			j++;
			e[j] = pii(a, b);
			E[a].emplace_back(pii(b, j));
			E[b].emplace_back(pii(a, j));
		}
		else
		{
			i++;
			Q[i] = piii(j, a, b);
		}
	}
	for (int p = 0; p < 20; p++)
		pre[1][p] = 1, bin[1][p] = no;
	dfs(1);
	cdec(1, 1);
	for (int i = 1, j = 0; i <= K; i++)
	{
		auto [t, a, b] = Q[i];
		while (j < t)
		{
			j++;
			for (auto [c, l, w] : update[j])
			{
				// cerr << "update " << j << ' ' << c << ' ' << w << '\n';
				bit[c].modify(w);
			}
		}
		if (b > 0)
		{
			int u = a, v = b;
			pii l = no, r = no;

			// cerr << merge(l, r).F << ' ' << merge(l, r).S << '\n';
			l = merge(merge(pii(t, t), getpath(a, b)), pii(0, 0));
			cout << (l != bad ? "yes\n" : "no\n");
		}
		else
		{
			int ans = 0;
			for (int p = 1; head[a][p]; p++)
			{
				int c = head[a][p];
				pii path = getpath(a, c);
				// cerr << a << ' ' << c << ' ' << path.F << ' ' << path.S << '\n';
				if (path == bad || path.F > path.S || path.S > t)
					continue;
				int k = path.S;
				// cerr << '+' << bit[c].query(k, -1) << '\n';
				ans += bit[c].query(k, -1);
			}
			cout << ans << '\n';
		}
	}
}

Compilation message

servers.cpp: In function 'int main()':
servers.cpp:205:8: warning: unused variable 'u' [-Wunused-variable]
  205 |    int u = a, v = b;
      |        ^
servers.cpp:205:15: warning: unused variable 'v' [-Wunused-variable]
  205 |    int u = a, v = b;
      |               ^
servers.cpp:206:16: warning: variable 'r' set but not used [-Wunused-but-set-variable]
  206 |    pii l = no, r = no;
      |                ^
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 13328 KB Output is correct
2 Correct 77 ms 15248 KB Output is correct
3 Correct 70 ms 15300 KB Output is correct
4 Correct 91 ms 15308 KB Output is correct
5 Correct 82 ms 15448 KB Output is correct
6 Correct 69 ms 15264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 13328 KB Output is correct
2 Correct 77 ms 15248 KB Output is correct
3 Correct 70 ms 15300 KB Output is correct
4 Correct 91 ms 15308 KB Output is correct
5 Correct 82 ms 15448 KB Output is correct
6 Correct 69 ms 15264 KB Output is correct
7 Correct 56 ms 13392 KB Output is correct
8 Correct 102 ms 16300 KB Output is correct
9 Correct 75 ms 16468 KB Output is correct
10 Correct 146 ms 16400 KB Output is correct
11 Correct 146 ms 16564 KB Output is correct
12 Correct 67 ms 16444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 13396 KB Output is correct
2 Correct 290 ms 71240 KB Output is correct
3 Correct 274 ms 71080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 13396 KB Output is correct
2 Correct 290 ms 71240 KB Output is correct
3 Correct 274 ms 71080 KB Output is correct
4 Correct 53 ms 13404 KB Output is correct
5 Correct 277 ms 71116 KB Output is correct
6 Correct 222 ms 71356 KB Output is correct
7 Correct 235 ms 71244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 58 ms 13324 KB Output is correct
2 Correct 388 ms 78468 KB Output is correct
3 Correct 394 ms 78588 KB Output is correct
4 Correct 335 ms 91600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 58 ms 13324 KB Output is correct
2 Correct 388 ms 78468 KB Output is correct
3 Correct 394 ms 78588 KB Output is correct
4 Correct 335 ms 91600 KB Output is correct
5 Correct 57 ms 13320 KB Output is correct
6 Correct 632 ms 81348 KB Output is correct
7 Correct 620 ms 93748 KB Output is correct
8 Correct 866 ms 81008 KB Output is correct
9 Correct 872 ms 80844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 13388 KB Output is correct
2 Correct 300 ms 78988 KB Output is correct
3 Correct 329 ms 70416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 13388 KB Output is correct
2 Correct 300 ms 78988 KB Output is correct
3 Correct 329 ms 70416 KB Output is correct
4 Correct 58 ms 13384 KB Output is correct
5 Correct 420 ms 82016 KB Output is correct
6 Correct 444 ms 73304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 13372 KB Output is correct
2 Correct 381 ms 78428 KB Output is correct
3 Correct 385 ms 78492 KB Output is correct
4 Correct 334 ms 91640 KB Output is correct
5 Correct 55 ms 13384 KB Output is correct
6 Correct 298 ms 79036 KB Output is correct
7 Correct 324 ms 70436 KB Output is correct
8 Correct 385 ms 71892 KB Output is correct
9 Correct 422 ms 71884 KB Output is correct
10 Correct 453 ms 79468 KB Output is correct
11 Correct 470 ms 79200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 13372 KB Output is correct
2 Correct 381 ms 78428 KB Output is correct
3 Correct 385 ms 78492 KB Output is correct
4 Correct 334 ms 91640 KB Output is correct
5 Correct 55 ms 13384 KB Output is correct
6 Correct 298 ms 79036 KB Output is correct
7 Correct 324 ms 70436 KB Output is correct
8 Correct 385 ms 71892 KB Output is correct
9 Correct 422 ms 71884 KB Output is correct
10 Correct 453 ms 79468 KB Output is correct
11 Correct 470 ms 79200 KB Output is correct
12 Correct 57 ms 13296 KB Output is correct
13 Correct 634 ms 81320 KB Output is correct
14 Correct 616 ms 93724 KB Output is correct
15 Correct 855 ms 80964 KB Output is correct
16 Correct 864 ms 80844 KB Output is correct
17 Correct 57 ms 14168 KB Output is correct
18 Correct 415 ms 82084 KB Output is correct
19 Correct 450 ms 73348 KB Output is correct
20 Correct 555 ms 74644 KB Output is correct
21 Correct 506 ms 74736 KB Output is correct
22 Correct 921 ms 81852 KB Output is correct
23 Correct 830 ms 88444 KB Output is correct
24 Correct 561 ms 86988 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 13388 KB Output is correct
2 Correct 77 ms 15216 KB Output is correct
3 Correct 72 ms 15268 KB Output is correct
4 Correct 86 ms 15352 KB Output is correct
5 Correct 87 ms 15520 KB Output is correct
6 Correct 69 ms 15340 KB Output is correct
7 Correct 54 ms 13384 KB Output is correct
8 Correct 288 ms 71188 KB Output is correct
9 Correct 283 ms 71260 KB Output is correct
10 Correct 55 ms 13312 KB Output is correct
11 Correct 371 ms 78432 KB Output is correct
12 Correct 380 ms 78488 KB Output is correct
13 Correct 340 ms 91620 KB Output is correct
14 Correct 61 ms 13480 KB Output is correct
15 Correct 303 ms 78996 KB Output is correct
16 Correct 330 ms 70404 KB Output is correct
17 Correct 410 ms 71896 KB Output is correct
18 Correct 389 ms 71952 KB Output is correct
19 Correct 452 ms 79492 KB Output is correct
20 Correct 468 ms 79248 KB Output is correct
21 Correct 310 ms 70884 KB Output is correct
22 Correct 307 ms 70736 KB Output is correct
23 Correct 335 ms 71624 KB Output is correct
24 Correct 378 ms 71900 KB Output is correct
25 Correct 449 ms 76420 KB Output is correct
26 Correct 353 ms 70148 KB Output is correct
27 Correct 337 ms 70196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 13388 KB Output is correct
2 Correct 77 ms 15216 KB Output is correct
3 Correct 72 ms 15268 KB Output is correct
4 Correct 86 ms 15352 KB Output is correct
5 Correct 87 ms 15520 KB Output is correct
6 Correct 69 ms 15340 KB Output is correct
7 Correct 54 ms 13384 KB Output is correct
8 Correct 288 ms 71188 KB Output is correct
9 Correct 283 ms 71260 KB Output is correct
10 Correct 55 ms 13312 KB Output is correct
11 Correct 371 ms 78432 KB Output is correct
12 Correct 380 ms 78488 KB Output is correct
13 Correct 340 ms 91620 KB Output is correct
14 Correct 61 ms 13480 KB Output is correct
15 Correct 303 ms 78996 KB Output is correct
16 Correct 330 ms 70404 KB Output is correct
17 Correct 410 ms 71896 KB Output is correct
18 Correct 389 ms 71952 KB Output is correct
19 Correct 452 ms 79492 KB Output is correct
20 Correct 468 ms 79248 KB Output is correct
21 Correct 310 ms 70884 KB Output is correct
22 Correct 307 ms 70736 KB Output is correct
23 Correct 335 ms 71624 KB Output is correct
24 Correct 378 ms 71900 KB Output is correct
25 Correct 449 ms 76420 KB Output is correct
26 Correct 353 ms 70148 KB Output is correct
27 Correct 337 ms 70196 KB Output is correct
28 Correct 56 ms 13376 KB Output is correct
29 Correct 101 ms 16340 KB Output is correct
30 Correct 80 ms 16392 KB Output is correct
31 Correct 143 ms 16364 KB Output is correct
32 Correct 145 ms 16472 KB Output is correct
33 Correct 71 ms 16440 KB Output is correct
34 Correct 54 ms 14284 KB Output is correct
35 Correct 287 ms 73904 KB Output is correct
36 Correct 239 ms 73128 KB Output is correct
37 Correct 242 ms 73128 KB Output is correct
38 Correct 56 ms 14252 KB Output is correct
39 Correct 736 ms 81340 KB Output is correct
40 Correct 678 ms 93768 KB Output is correct
41 Correct 940 ms 80888 KB Output is correct
42 Correct 1008 ms 80940 KB Output is correct
43 Correct 58 ms 14256 KB Output is correct
44 Correct 449 ms 82000 KB Output is correct
45 Correct 461 ms 73288 KB Output is correct
46 Correct 554 ms 74716 KB Output is correct
47 Correct 575 ms 74740 KB Output is correct
48 Correct 995 ms 81864 KB Output is correct
49 Correct 879 ms 88356 KB Output is correct
50 Correct 635 ms 87024 KB Output is correct
51 Correct 289 ms 73996 KB Output is correct
52 Correct 268 ms 74024 KB Output is correct
53 Correct 269 ms 73608 KB Output is correct
54 Correct 266 ms 74276 KB Output is correct
55 Correct 275 ms 73740 KB Output is correct
56 Correct 456 ms 74764 KB Output is correct
57 Correct 567 ms 79484 KB Output is correct
58 Correct 622 ms 72952 KB Output is correct
59 Correct 427 ms 73424 KB Output is correct