답안 #395394

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
395394 2021-04-28T10:25:03 Z wenqi Joker (BOI20_joker) C++14
25 / 100
2000 ms 17932 KB
#include <bits/stdc++.h>

using namespace std;

int N, M, Q;

int parents[600069];
int sz[600069];

int ans[600069];

#define ROOT 20

struct E {
	int i, a;
	int j, b;
};

struct R {
	int i, l, r, bl;
};

vector<E> moves;

void reset() {
	for (int i = 0; i < 2 * N; i++) {
		parents[i] = i;
		sz[i] = 1;
	}
	moves.clear();
}

int getp(int i) {
	return i == parents[i] ? i : getp(parents[i]);
}

bool join(int a, int b) {
	a = getp(a);
	b = getp(b);

	if(a == b) {
		moves.push_back({-1});
		return false;
	}

	if(sz[a] > sz[b]) {
		moves.push_back({b, parents[b], a, sz[a]});
		parents[b] = a;
		sz[a] += sz[b];
	}else{
		moves.push_back({a, parents[a], b, sz[b]});
		parents[a] = b;
		sz[b] += sz[a];
	}

	return getp(a) == getp((a + N) % (2 * N)) or getp(b) == getp((b + N) % (2 * N));
}

void reload() {
	auto p = moves.back();
	moves.pop_back();

	if(p.i == -1)
		return;

	parents[p.i] = p.a;
	sz[p.j] = p.b;
}

int A[200069];
int B[200069];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N >> M >> Q;
	for (int i = 1; i <= M; i++) {
		int a, b;
		cin >> a >> b;
		A[i] = --a;
		B[i] = --b;
	}
	vector<R> queries;
	for (int i = 0; i < Q; i++) {
		int l, r;
		cin >> l >> r;
		queries.push_back({i, l, r, l / ROOT});
	}
	sort(queries.begin(), queries.end(), [](R& a, R& b) {
		return a.bl < b.bl or (a.bl == b.bl and a.r > b.r);
	});
	bool made = false;
	int pbl = -1;
	int nxt = 0;
	int up = 0;
	int start = 1;
	for (const R& a : queries) {
		int Bs = a.bl * ROOT;

		bool doable;

		if(a.bl != pbl) {
			reset();
			doable = false;

			for(int i = 0; i < up; i++) {
				reload();
			}

			for (; start < Bs; start++) {
				made |= join(A[start], B[start] + N);
				made |= join(A[start] + N, B[start]);
			}

			nxt = M;
			pbl = a.bl;
		}

		for(; nxt > a.r; nxt--) {
			doable |= join(A[nxt], B[nxt] + N);
			doable |= join(A[nxt] + N, B[nxt]);
			up += 2;
		}

		bool k = false;

		int cnt = 0;

		for (int i = Bs; i < a.l; i++) {
			if(i == 0) continue;
			k |= join(A[i], B[i] + N);
			k |= join(A[i] + N, B[i]);
			cnt += 2;
		}

		ans[a.i] = made or k or doable;

		for (int i = 0; i < cnt; i++) {
			reload();
		}
	}
	for(int i = 0; i < Q; i++) {
		cout << (ans[i] ? "YES" : "NO") << '\n';
	}
	return 0;
}

Compilation message

Joker.cpp: In function 'int main()':
Joker.cpp:121:11: warning: 'doable' may be used uninitialized in this function [-Wmaybe-uninitialized]
  121 |    doable |= join(A[nxt] + N, B[nxt]);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Execution timed out 2080 ms 328 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Execution timed out 2080 ms 328 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 128 ms 16132 KB Output is correct
4 Correct 137 ms 17840 KB Output is correct
5 Correct 148 ms 17588 KB Output is correct
6 Correct 137 ms 16344 KB Output is correct
7 Correct 136 ms 16260 KB Output is correct
8 Correct 122 ms 15652 KB Output is correct
9 Correct 128 ms 16312 KB Output is correct
10 Correct 149 ms 17932 KB Output is correct
11 Correct 125 ms 16308 KB Output is correct
12 Correct 136 ms 17576 KB Output is correct
13 Correct 129 ms 15096 KB Output is correct
14 Correct 130 ms 15688 KB Output is correct
15 Correct 140 ms 16932 KB Output is correct
16 Correct 161 ms 17856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Execution timed out 2080 ms 328 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Execution timed out 2080 ms 328 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Execution timed out 2080 ms 328 KB Time limit exceeded
8 Halted 0 ms 0 KB -