답안 #198491

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
198491 2020-01-26T11:35:15 Z ZwariowanyMarcin Klasika (COCI20_klasika) C++17
33 / 110
5000 ms 524172 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define ss(x) (int) x.size()
#define pb push_back
#define LL long long
#define ld long double
#define cat(x) cerr << #x << " = " << x << endl
#define FOR(i, j, n) for(int i = j; i <= n; ++i)
#define boost cin.tie(0), ios_base::sync_with_stdio(0);


using namespace std;		

const int nax = 200100;
const int pod = (1 << 18);

int q;
int t[nax];
int a[nax];
int b[nax];
int e[nax];

char s[10];

vector <int> v[nax];
int path[nax];

int tim;
int in[nax];
int out[nax];

void dfs(int u) {
	in[u] = tim++;
	for (auto it : v[u])
		dfs(it);
	out[u] = tim;
}

struct trie {
	int fre = 1;
	vector <int> go[2];
	vector <int> z;
	
	void init(int N) {
		go[0].resize(1, 0);
		go[1].resize(1, 0);
	}
	
	void add(const int& x) {
		int u = 0;
		for (int i = 29; 0 <= i; --i) {
			int c = ((x >> i) & 1);
			if (!go[c][u]) {
				go[c][u] = fre++;
				go[0].pb(0);
				go[1].pb(0);
			}
			u = go[c][u];
		}
	}
	
	int query(const int& x) {
		if (!z.empty()) {
			int best = 0;
			for (auto it : z)
				best = max(best, (it ^ x));
			return best;
		}
		int res = 0;
		int u = 0;
		for (int i = 29; 0 <= i; --i) {
			int c = !((x >> i) & 1);
			if (go[c][u]) {
				res += 1 << i;
				u = go[c][u];
			}
			else if(go[!c][u]) 
				u = go[!c][u];
			else return 0;
		}
		return res;
	}
};

trie d[2 * pod];
				
void add(int u, int x) {
	u += pod;
	int dl = 1;
	while (u) {
		if (dl <= 16) d[u].z.pb(x);
		else d[u].add(x);
		u /= 2;
		dl *= 2;
	}
}	

void make(int u = 1, int z = pod) {
	d[u].init(z);
	if (pod <= u) return;
	make(2 * u, z / 2);
	make(2 * u + 1, z / 2);
}		

int query(int x, int y, int z) {
	int best = 0;
	for (x += pod, y += pod; x < y; x /= 2, y /= 2) {
		if (x & 1) best = max(best, d[x++].query(z));
		if (y & 1) best = max(best, d[--y].query(z));
	}
	return best;	
}

int main() {
	scanf ("%d", &q);
	int node = 2;
	for (int i = 1; i <= q; ++i) {
		scanf ("%s%d%d", s, a + i, b + i);
		t[i] = (s[0] == 'A');
		if (t[i]) {
			e[i] = node;
			path[node] = (path[a[i]] ^ b[i]);
			v[a[i]].pb(node++);
		}
	}
	dfs(1);
	
	make();
	
	add(in[1], 0);
	for (int i = 1; i <= q; ++i) {
		if (t[i] == 1) add(in[e[i]], path[e[i]]);
		else printf ("%d\n", query(in[b[i]], out[b[i]], path[a[i]]));
	} 
		
	return 0;
}

Compilation message

klasika.cpp: In function 'int main()':
klasika.cpp:117:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf ("%d", &q);
  ~~~~~~^~~~~~~~~~
klasika.cpp:120:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%s%d%d", s, a + i, b + i);
   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 155 ms 79224 KB Output is correct
2 Correct 159 ms 79104 KB Output is correct
3 Correct 149 ms 79352 KB Output is correct
4 Correct 159 ms 79420 KB Output is correct
5 Correct 147 ms 79100 KB Output is correct
6 Correct 159 ms 79224 KB Output is correct
7 Correct 156 ms 79352 KB Output is correct
8 Correct 154 ms 79436 KB Output is correct
9 Correct 147 ms 79224 KB Output is correct
10 Correct 147 ms 79456 KB Output is correct
11 Correct 152 ms 79352 KB Output is correct
12 Correct 162 ms 79352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 155 ms 79224 KB Output is correct
2 Correct 159 ms 79104 KB Output is correct
3 Correct 149 ms 79352 KB Output is correct
4 Correct 159 ms 79420 KB Output is correct
5 Correct 147 ms 79100 KB Output is correct
6 Correct 159 ms 79224 KB Output is correct
7 Correct 156 ms 79352 KB Output is correct
8 Correct 154 ms 79436 KB Output is correct
9 Correct 147 ms 79224 KB Output is correct
10 Correct 147 ms 79456 KB Output is correct
11 Correct 152 ms 79352 KB Output is correct
12 Correct 162 ms 79352 KB Output is correct
13 Correct 156 ms 80504 KB Output is correct
14 Correct 149 ms 81912 KB Output is correct
15 Correct 176 ms 82808 KB Output is correct
16 Correct 164 ms 84060 KB Output is correct
17 Correct 148 ms 80504 KB Output is correct
18 Correct 157 ms 81912 KB Output is correct
19 Correct 177 ms 82680 KB Output is correct
20 Correct 180 ms 83576 KB Output is correct
21 Correct 162 ms 80632 KB Output is correct
22 Correct 156 ms 81912 KB Output is correct
23 Correct 173 ms 82552 KB Output is correct
24 Correct 168 ms 83508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 858 ms 189116 KB Output is correct
2 Correct 1397 ms 294888 KB Output is correct
3 Correct 1900 ms 401172 KB Output is correct
4 Correct 4234 ms 506464 KB Output is correct
5 Correct 1520 ms 201940 KB Output is correct
6 Correct 2645 ms 320484 KB Output is correct
7 Correct 3616 ms 437504 KB Output is correct
8 Execution timed out 5326 ms 524172 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 155 ms 79224 KB Output is correct
2 Correct 159 ms 79104 KB Output is correct
3 Correct 149 ms 79352 KB Output is correct
4 Correct 159 ms 79420 KB Output is correct
5 Correct 147 ms 79100 KB Output is correct
6 Correct 159 ms 79224 KB Output is correct
7 Correct 156 ms 79352 KB Output is correct
8 Correct 154 ms 79436 KB Output is correct
9 Correct 147 ms 79224 KB Output is correct
10 Correct 147 ms 79456 KB Output is correct
11 Correct 152 ms 79352 KB Output is correct
12 Correct 162 ms 79352 KB Output is correct
13 Correct 156 ms 80504 KB Output is correct
14 Correct 149 ms 81912 KB Output is correct
15 Correct 176 ms 82808 KB Output is correct
16 Correct 164 ms 84060 KB Output is correct
17 Correct 148 ms 80504 KB Output is correct
18 Correct 157 ms 81912 KB Output is correct
19 Correct 177 ms 82680 KB Output is correct
20 Correct 180 ms 83576 KB Output is correct
21 Correct 162 ms 80632 KB Output is correct
22 Correct 156 ms 81912 KB Output is correct
23 Correct 173 ms 82552 KB Output is correct
24 Correct 168 ms 83508 KB Output is correct
25 Correct 858 ms 189116 KB Output is correct
26 Correct 1397 ms 294888 KB Output is correct
27 Correct 1900 ms 401172 KB Output is correct
28 Correct 4234 ms 506464 KB Output is correct
29 Correct 1520 ms 201940 KB Output is correct
30 Correct 2645 ms 320484 KB Output is correct
31 Correct 3616 ms 437504 KB Output is correct
32 Execution timed out 5326 ms 524172 KB Time limit exceeded
33 Halted 0 ms 0 KB -