답안 #764533

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
764533 2023-06-23T14:35:48 Z NK_ 동기화 (JOI13_synchronization) C++17
0 / 100
318 ms 29276 KB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'
#define pb push_back
#define sz(x) int(x.size())

template<class T> using V = vector<T>;
template<class T, size_t SZ> using AR = array<T, SZ>;

struct DSU {
	V<int> e, ans; V<AR<int, 2>> last; V<AR<int, 5>> his; 
	void init(int N) { e = V<int>(N, -1); ans = V<int>(N, 1); last = V<AR<int, 2>>(N, {0, 0}); his = {}; }
	int get(int x) { return e[x] < 0 ? x : get(e[x]); }
	int info(int x) { return ans[get(x)]; }
	void upd(int x, int y, int i) {
		// cout << x << " " << ans[x] << " " << y << " " << ans[y] << endl;
		int dx = ans[y] - last[i][0];
		int dy = ans[x] - last[i][1];
		ans[x] += dx, ans[y] += dy;
		last[i] = {ans[x], ans[y]};
	}
	void unite(int x, int y, int i) {
		// cout << x << endl;
		x = get(x), y = get(y); 
		// cout << x << " " << ans[x] << " " << y << " " << ans[y] << endl;
		upd(x, y, i);
		// if (x == y) { his.pb({-1, -1, -1, -1, i}); return 0; }
		if (e[x] > e[y]) swap(x, y);
		his.pb({x, e[x], y, e[y], i});
		e[x] += e[y]; e[y] = x;
	} 
	int rollback() {
		if (sz(his) == 0) return -1;
		auto [x, ex, y, ey, i] = his.back(); his.pop_back();
		e[x] = ex, e[y] = ey;
		upd(x, y, i);
		return i;
	}
};

const int BLK = 400;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int N, M, Q; cin >> N >> M >> Q;

	V<V<int>> adj(N);
	V<AR<int, 2>> E(N-1);
	for(int e = 0; e < N-1; e++) {
		int u, v; cin >> u >> v; --u, --v;
		E[e] = {u, v};
	}

	DSU D; D.init(N);

	V<V<AR<int, 2>>> EV(N);
	V<int> T(M);
	for(int i = 0; i < M; i++) {
		int x; cin >> x; --x;
		T[i] = x;
		// cout << x << " " << sz(EV[x]) << endl;
		EV[x].pb({i, sz(EV[x]) % 2});
	}

	for(int i = 0; i < N; i++) reverse(begin(EV[i]), end(EV[i]));

	auto rebuild = [&]() {
		V<int> ed;
		
		while(1) {
			int r = D.rollback();
			if (r == -1) break;
			else ed.pb(r);
		}

		sort(begin(ed), end(ed), [&](int x, int y) {
			return EV[x].back() > EV[y].back();
		});

		for(auto& e : ed) D.unite(E[e][0], E[e][1], e);
	};

	auto rem = [&](int x) {
		V<int> add; 

		while(1) {
			int r = D.rollback();
			if (r == x) break;
			else add.pb(r);
		}

		assert(sz(add) <= 2*BLK);

		reverse(begin(add), end(add));
		for(auto& e : add) D.unite(E[e][0], E[e][1], e);
	};	
	
	set<int> ex; 
	for(int i = 0; i < M; i++) {
		int e = T[i], t = EV[T[i]].back()[1]; EV[T[i]].pop_back();
		// cout << e << " " << t << endl;

		if (t == 0) {
			ex.insert(e);
			D.unite(E[e][0], E[e][1], e);
		} else {
			if (ex.find(e) != ex.end()) ex.erase(e);
			rem(e);
		}

		if (size(ex) >= BLK) {
			rebuild();
			ex = {};
		}
	}

	while(Q--) {
		int u; cin >> u; --u;
		cout << D.ans[u] << nl;
	}


    return 0;
}


# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Incorrect 1 ms 212 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 318 ms 29276 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 59 ms 26436 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 316 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 0 ms 212 KB Output isn't correct
4 Halted 0 ms 0 KB -