Submission #447208

# Submission time Handle Problem Language Result Execution time Memory
447208 2021-07-25T06:21:31 Z hhhhaura Inside information (BOI21_servers) C++14
50 / 100
578 ms 47428 KB
#define wiwihorz
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma loop-opt(on)

#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define rrep(i, a, b) for(int i = b; i >= a; i --)
#define ceil(a, b) ((a + b - 1) / (b))
#define all(x) x.begin(), x.end()

#define INF 1000000000000000000
#define MOD 1000000007
#define eps (1e-9)

using namespace std;

#define int long long int
#define lld long double
#define pii pair<int, int>
#define random mt19938 rnd(chrono::steady_clock::now().time_since_epoch().count())

#ifdef wiwihorz
#define print(a...) cerr << "Line " << __LINE__ << ": ", kout("[" + string(#a) + "] = ", a)
void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
void kout() { cerr << endl; }
template<class T1, class ... T2> void kout(T1 a, T2 ... e) { cerr << a << " ", kout(e...); }
#else
#define print(...) 0
#define vprint(...) 0
#endif
/*struct BIT {
	int n;
	vector<int> v;
	stack<pii> ops;
	void init_(int _n) {
		n = _n;
		v.assign(n + 1, 0);
	}
	int lowbit(int x) { return x & (-x); }
	void modify(int x, int val) {
		if(x == 0) return;
		if(val > 0) ops.push({x, val});
		for(int i = x; i <= n; i += lowbit(i)) {
			v[i] += val;
		}
	}
	int query(int x) {
		int ans = 0;
		for(int i = x; i > 0; i -= lowbit(i)) {
			ans += v[i];
		}
		return ans;
	}
	int ask(int x) {
		return query(n) - query(x - 1);
	}
	void undo() {
		while(ops.size()) {
			pii cur = ops.top(); ops.pop();
			modify(cur.first, -cur.second);
		}
	}
};
*/
namespace solver {
	int n, k;
//	BIT bit;
	vector<int> vis, mx, sz, R, ch;
	vector<int> L, J, es, cost, t, ans, tp;
	vector<pii> a;
	vector<vector<pii>> nxt;
	vector<vector<int>> mp;
	void init_(int _n, int _k) {
		n = _n, k = _k;
//		bit.init_(n + k);
		vis.assign(n + 1, 0);
		mx.assign(n + 1, 0);
		sz.assign(n + 1, 0);
		R.assign(n + 1, 0);
		L.assign(n + 1, 0);
		J.assign(n + 1, 0);
		
		es.assign(1, 0);
		cost.assign(1, INF);
		ch.clear();
		
		tp.assign(k + 1, 0);
		a.assign(k + 1, {0, 0});
		ans.assign(k + 1, 0);
		t.assign(k + 1, 0);
		nxt.assign(n + 1, vector<pii>());
		mp.assign(n + 1, vector<int>());
	}
	void add_edge(int a, int b, int c) {
		mp[a].push_back(es.size());
		mp[b].push_back(es.size());
		es.push_back(a ^ b);
		cost.push_back(c);
	}
	void get_sz(int x, int par) {
		mx[x] = 0, sz[x] = 1;
		ch.push_back(x);
		for(auto i : mp[x]) if(i != par) {
			int to = es[i] ^ x;
			if(vis[to]) continue;
			get_sz(to, i);
			sz[x] += sz[to];
			mx[x] = max(mx[x], sz[to]);
		}
	}
	int get_cen(int x, int par, int tot) {
		int best = x;
		for(auto i : mp[x]) if(i != par) {
			int to = es[i] ^ x;
			if(vis[to]) continue;
			int cur = get_cen(to, i, tot);
			if(max(mx[cur], tot - sz[cur]) < 
				max(mx[best], tot - sz[best])) best = cur;
		}
		return best;
	}
	void dfs(int x, int par, int l, int j, int r) {
		J[x] = j, L[x] = l, R[x] = r;
		for(auto i : mp[x]) if(i != par) {
			int to = es[i] ^ x;
			if(vis[to]) continue;
			dfs(to, i, l,
				(cost[par] > cost[i] ? j : INF), 
				(cost[par] < cost[i] ? max(cost[i], r) : INF)
			);
		}
	}
	void deco(int x, vector<pii> q) {
		ch.clear();
		get_sz(x, -1);
		int c = get_cen(x, -1, sz[x]);
		vis[c] = 1;
		R[c] = J[c] = L[c] = 0;
		vector<vector<pii>> temp(mp[c].size(), vector<pii>());
		for(auto i : mp[c]) {
			int to = es[i] ^ c;
			if(vis[to]) continue;
			nxt[i].clear();
			dfs(to, i, i, cost[i], cost[i]);
		}
		vector<pii> s;
		for(auto i : q) {
			if(i.first == 1) {
				int x, y; tie(x, y) = a[i.second];
				if(L[x] == L[y]) nxt[L[x]].push_back(i);
				else if(x == c) ans[i.second] = (t[i.second] > J[y]);	
				else if(y == c) ans[i.second] = (t[i.second] > R[x]);	
				else ans[i.second] = (J[y] < cost[L[x]] && t[i.second] > R[x]);	
			}
//			else s.push_back({0, i.second});
		}
/*		for(auto i : ch) s.push_back({1, i});
		sort(all(s), [](pii a, pii b) {
			int t1 = (a.first? R[a.second] : t[a.second]);
			int t2 = (b.first? R[b.second] : t[b.second]);
			return t1 < t2;
		});			 
		for(auto i : s) {
			if(i.first) bit.modify(min(n + k, cost[L[i.second]]), 1);
			else {
				int x = a[i.second].first;
				ans[i.second] += bit.ask(min(J[x] + 1, n + k + 1));
				if(x != c) nxt[L[x]].push_back({2, i.second});
			}
		}
		bit.undo();
*/
		rep(i, 0, signed(mp[c].size()) - 1) {
			temp[i].swap(nxt[mp[c][i]]);
		}
		rep(i, 0, signed(mp[c].size()) - 1) {
			int e = mp[c][i], to = es[e] ^ c;
			if(vis[to]) continue;
			deco(to, temp[i]);
		}
		return;
	}
};
using namespace solver;
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	int n, k, cur = 0; 
	cin >> n >> k;
	init_(n, k);
	vector<pii> q;
	rep(i, 1, n + k - 1) {
		char c; cin >> c;
		if(c == 'S') {
			int x, y; cin >> x >> y;
			add_edge(x, y, i);
		}
		else if(c == 'Q') {
			int x, y; cin >> x >> y;
			a[++cur] = {x, y};
			tp[cur] = 1, t[cur] = i;
			if(x == y) ans[cur] = 1;
			else q.push_back({1, cur});
		}
		else {
			int x; cin >> x;
			a[++cur] = {x, -1};
			tp[cur] = 2, t[cur] = i;
			q.push_back({2, cur});
		} 
	}
	deco(1, q);
	rep(i, 1, k) {
		if(tp[i] == 1) cout << (ans[i] ? "yes" : "no") << "\n";
		else cout << ans[i] << "\n";
	}
	return 0;
}
/*
6 9
S 1 2
S 1 3
S 3 4
Q 5 1
S 4 5
S 1 6
Q 5 1
Q 1 5
C 1
C 2
C 3
C 4
C 5
C 6
*/

Compilation message

servers.cpp:4: warning: ignoring '#pragma loop ' [-Wunknown-pragmas]
    4 | #pragma loop-opt(on)
      | 
servers.cpp:24:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   24 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |             ^~~~
servers.cpp:24:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   24 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |                     ^~~~
# Verdict Execution time Memory Grader output
1 Correct 45 ms 9916 KB Output is correct
2 Correct 46 ms 12056 KB Output is correct
3 Correct 51 ms 15044 KB Output is correct
4 Correct 55 ms 12808 KB Output is correct
5 Correct 55 ms 13108 KB Output is correct
6 Correct 42 ms 10820 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 45 ms 9916 KB Output is correct
2 Correct 46 ms 12056 KB Output is correct
3 Correct 51 ms 15044 KB Output is correct
4 Correct 55 ms 12808 KB Output is correct
5 Correct 55 ms 13108 KB Output is correct
6 Correct 42 ms 10820 KB Output is correct
7 Incorrect 40 ms 10588 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 36 ms 9336 KB Output is correct
2 Correct 169 ms 31500 KB Output is correct
3 Correct 141 ms 34292 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 36 ms 9336 KB Output is correct
2 Correct 169 ms 31500 KB Output is correct
3 Correct 141 ms 34292 KB Output is correct
4 Incorrect 35 ms 9660 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 39 ms 10740 KB Output is correct
2 Correct 552 ms 41584 KB Output is correct
3 Correct 540 ms 44700 KB Output is correct
4 Correct 231 ms 47388 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 39 ms 10740 KB Output is correct
2 Correct 552 ms 41584 KB Output is correct
3 Correct 540 ms 44700 KB Output is correct
4 Correct 231 ms 47388 KB Output is correct
5 Incorrect 39 ms 11432 KB Extra information in the output file
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 45 ms 10404 KB Output is correct
2 Correct 233 ms 30156 KB Output is correct
3 Correct 453 ms 33988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 45 ms 10404 KB Output is correct
2 Correct 233 ms 30156 KB Output is correct
3 Correct 453 ms 33988 KB Output is correct
4 Incorrect 38 ms 11040 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 10492 KB Output is correct
2 Correct 578 ms 41456 KB Output is correct
3 Correct 530 ms 44620 KB Output is correct
4 Correct 235 ms 47428 KB Output is correct
5 Correct 38 ms 11300 KB Output is correct
6 Correct 229 ms 33364 KB Output is correct
7 Correct 493 ms 33956 KB Output is correct
8 Correct 439 ms 33400 KB Output is correct
9 Correct 517 ms 34588 KB Output is correct
10 Correct 529 ms 39120 KB Output is correct
11 Correct 455 ms 38412 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 10492 KB Output is correct
2 Correct 578 ms 41456 KB Output is correct
3 Correct 530 ms 44620 KB Output is correct
4 Correct 235 ms 47428 KB Output is correct
5 Correct 38 ms 11300 KB Output is correct
6 Correct 229 ms 33364 KB Output is correct
7 Correct 493 ms 33956 KB Output is correct
8 Correct 439 ms 33400 KB Output is correct
9 Correct 517 ms 34588 KB Output is correct
10 Correct 529 ms 39120 KB Output is correct
11 Correct 455 ms 38412 KB Output is correct
12 Incorrect 37 ms 11356 KB Extra information in the output file
13 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 35 ms 9416 KB Output is correct
2 Correct 46 ms 10772 KB Output is correct
3 Correct 49 ms 13640 KB Output is correct
4 Correct 50 ms 11376 KB Output is correct
5 Correct 51 ms 11784 KB Output is correct
6 Correct 45 ms 9432 KB Output is correct
7 Correct 36 ms 8872 KB Output is correct
8 Correct 149 ms 31528 KB Output is correct
9 Correct 144 ms 34424 KB Output is correct
10 Correct 40 ms 11448 KB Output is correct
11 Correct 521 ms 44832 KB Output is correct
12 Correct 540 ms 44616 KB Output is correct
13 Correct 230 ms 47420 KB Output is correct
14 Correct 38 ms 11288 KB Output is correct
15 Correct 232 ms 33304 KB Output is correct
16 Correct 436 ms 33836 KB Output is correct
17 Correct 434 ms 33400 KB Output is correct
18 Correct 513 ms 34764 KB Output is correct
19 Correct 526 ms 39068 KB Output is correct
20 Correct 468 ms 38276 KB Output is correct
21 Correct 183 ms 35380 KB Output is correct
22 Correct 175 ms 34836 KB Output is correct
23 Correct 341 ms 36392 KB Output is correct
24 Correct 351 ms 36296 KB Output is correct
25 Correct 576 ms 40348 KB Output is correct
26 Correct 436 ms 32456 KB Output is correct
27 Correct 449 ms 32724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 35 ms 9416 KB Output is correct
2 Correct 46 ms 10772 KB Output is correct
3 Correct 49 ms 13640 KB Output is correct
4 Correct 50 ms 11376 KB Output is correct
5 Correct 51 ms 11784 KB Output is correct
6 Correct 45 ms 9432 KB Output is correct
7 Correct 36 ms 8872 KB Output is correct
8 Correct 149 ms 31528 KB Output is correct
9 Correct 144 ms 34424 KB Output is correct
10 Correct 40 ms 11448 KB Output is correct
11 Correct 521 ms 44832 KB Output is correct
12 Correct 540 ms 44616 KB Output is correct
13 Correct 230 ms 47420 KB Output is correct
14 Correct 38 ms 11288 KB Output is correct
15 Correct 232 ms 33304 KB Output is correct
16 Correct 436 ms 33836 KB Output is correct
17 Correct 434 ms 33400 KB Output is correct
18 Correct 513 ms 34764 KB Output is correct
19 Correct 526 ms 39068 KB Output is correct
20 Correct 468 ms 38276 KB Output is correct
21 Correct 183 ms 35380 KB Output is correct
22 Correct 175 ms 34836 KB Output is correct
23 Correct 341 ms 36392 KB Output is correct
24 Correct 351 ms 36296 KB Output is correct
25 Correct 576 ms 40348 KB Output is correct
26 Correct 436 ms 32456 KB Output is correct
27 Correct 449 ms 32724 KB Output is correct
28 Incorrect 39 ms 10924 KB Extra information in the output file
29 Halted 0 ms 0 KB -