답안 #844938

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
844938 2023-09-06T09:31:46 Z serifefedartar Klasika (COCI20_klasika) C++17
33 / 110
1404 ms 524288 KB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 20;
const ll MAXN = 2e5 + 5;
 
vector<pair<int,pair<int,int>>> queries;
vector<vector<int>> graph;
vector<set<int>> sets;
vector<int> val;
int tin[MAXN], tout[MAXN];
 
struct Node {
	Node *to[2];
	int id;
	Node () {
		to[0] = NULL;
		to[1] = NULL;
	}
};
 
int T = 0;
void dfs(int node, int parent) {
	tin[node] = ++T;
	for (auto u : graph[node])
		dfs(u, node);
	tout[node] = T;
}
 
bool check(Node *node, int subtree) {
	int st = tin[subtree];
	int en = tout[subtree];
	auto u = sets[node->id].lower_bound(st);
	if (u == sets[node->id].end() || *u > en)
		return false;
	return true;
}
 
int solve(Node *node, int subtree, int val) {
	int ans = 0;
	for (int i = 30; i >= 0; i--) {
		bool bit = ((1<<i) & val) != 0;
		if (node->to[!bit] != NULL && check(node->to[!bit], subtree)) {
			ans += (1<<i);
			node = node->to[!bit];
		} else if (node->to[bit] != NULL && check(node->to[bit], subtree))
			node = node->to[bit];
		else
			return 0; 
	}
	return ans;
}
 
int main() {
	fast
	int Q;
	cin >> Q;
 
	queries = vector<pair<int,pair<int,int>>>(Q);
	graph = vector<vector<int>>(Q+5, vector<int>());
	val = vector<int>(Q+5, 0);
	int nodes = 1, a, b;
	string type;
	for (int i = 0; i < Q; i++) {
		cin >> type >> a >> b;
 
		if (type == "Add") {
			nodes++;
			val[nodes] = (val[a] ^ b);
			queries[i] = make_pair(1, make_pair(nodes, val[nodes]));
			graph[a].push_back(nodes);
		} else
			queries[i] = make_pair(0, make_pair(a, b));
	}
	dfs(1, 1);
 	
 	sets = vector<set<int>>(31*nodes, set<int>());
	Node *root = new Node();
	root->id = 1;
	int ids = 1;
	Node *now2 = root;
	sets[now2->id].insert(1);
	for (int i = 30; i >= 0; i--) {
				bool bit = 0;
				if (now2->to[bit] == NULL) {
					now2->to[bit] = new Node();
					now2->to[bit]->id = ++ids;
				}
				now2 = now2->to[bit];
				sets[now2->id].insert(1);
	}

	for (auto u : queries) {
		if (u.f) {
			Node *now = root;
			sets[now->id].insert(tin[u.s.f]);
			int x = u.s.s;
			for (int i = 30; i >= 0; i--) {
				bool bit = ((1<<i) & x) != 0;
				if (now->to[bit] == NULL) {
					now->to[bit] = new Node();
					now->to[bit]->id = ++ids;
				}
				now = now->to[bit];
				sets[now->id].insert(tin[u.s.f]);
			}
		} else {
			int node = u.s.f; 
			int subtree = u.s.s;
			Node *now = root;
			cout << solve(now, subtree, val[node]) << "\n";
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 604 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 1 ms 1112 KB Output is correct
4 Correct 1 ms 860 KB Output is correct
5 Correct 0 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 856 KB Output is correct
8 Correct 1 ms 860 KB Output is correct
9 Correct 1 ms 564 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 604 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 1 ms 1112 KB Output is correct
4 Correct 1 ms 860 KB Output is correct
5 Correct 0 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 856 KB Output is correct
8 Correct 1 ms 860 KB Output is correct
9 Correct 1 ms 564 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 860 KB Output is correct
13 Correct 4 ms 2140 KB Output is correct
14 Correct 5 ms 3416 KB Output is correct
15 Correct 6 ms 4956 KB Output is correct
16 Correct 7 ms 6312 KB Output is correct
17 Correct 3 ms 1884 KB Output is correct
18 Correct 5 ms 3416 KB Output is correct
19 Correct 6 ms 4956 KB Output is correct
20 Correct 7 ms 6172 KB Output is correct
21 Correct 3 ms 2136 KB Output is correct
22 Correct 5 ms 3420 KB Output is correct
23 Correct 6 ms 4956 KB Output is correct
24 Correct 7 ms 6236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 533 ms 151008 KB Output is correct
2 Correct 1002 ms 290116 KB Output is correct
3 Correct 1404 ms 426076 KB Output is correct
4 Runtime error 1246 ms 524288 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 604 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 1 ms 1112 KB Output is correct
4 Correct 1 ms 860 KB Output is correct
5 Correct 0 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 856 KB Output is correct
8 Correct 1 ms 860 KB Output is correct
9 Correct 1 ms 564 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 860 KB Output is correct
13 Correct 4 ms 2140 KB Output is correct
14 Correct 5 ms 3416 KB Output is correct
15 Correct 6 ms 4956 KB Output is correct
16 Correct 7 ms 6312 KB Output is correct
17 Correct 3 ms 1884 KB Output is correct
18 Correct 5 ms 3416 KB Output is correct
19 Correct 6 ms 4956 KB Output is correct
20 Correct 7 ms 6172 KB Output is correct
21 Correct 3 ms 2136 KB Output is correct
22 Correct 5 ms 3420 KB Output is correct
23 Correct 6 ms 4956 KB Output is correct
24 Correct 7 ms 6236 KB Output is correct
25 Correct 533 ms 151008 KB Output is correct
26 Correct 1002 ms 290116 KB Output is correct
27 Correct 1404 ms 426076 KB Output is correct
28 Runtime error 1246 ms 524288 KB Execution killed with signal 9
29 Halted 0 ms 0 KB -