제출 #113058

#제출 시각아이디문제언어결과실행 시간메모리
113058maruii동기화 (JOI13_synchronization)C++14
100 / 100
269 ms17912 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> edge[100001];
int dfn[100001], efn[100001], ifn[100001], dfnn;

void dfs(int x, int p) {
	dfn[x] = ++dfnn;
	ifn[dfnn] = x;
	for (auto i: edge[x]) {
		if (i != p)	dfs(i, x);
	}
	efn[x] = dfnn;
}

const int SIZE = 1 << 17;
struct ST {
	int V[SIZE << 1];
	
	void init(int nn, int s, int e) {
		if (s == e) {
			V[nn] = efn[ifn[s]];
			return;
		}
		int m = s + e >> 1;
		init(nn << 1, s, m);
		init(nn << 1 | 1, m + 1, e);
		V[nn] = max(V[nn << 1], V[nn << 1 | 1]);
	}

	void update(int nn, int ns, int ne, int x, int v) {
		if (ns > x || ne < x) return;
		if (ns == ne) {
			V[nn] = v;
			return;
		}
		int m = ns + ne >> 1;
		update(nn << 1, ns, m, x, v);
		update(nn << 1 | 1, m + 1, ne, x, v);
		V[nn] = max(V[nn << 1], V[nn << 1 | 1]);
	}

	int query(int nn, int ns, int ne, int s, int e) {
		if (ns > s || V[nn] < e) return 0;
		if (ns == ne) return ifn[ns];
		int m = ns + ne >> 1;
		int ret = query(nn << 1 | 1, m + 1, ne, s, e);
		if (ret) return ret;
		return query(nn << 1, ns, m, s, e);
	}
} seg;

int X[100002], Y[100002], T[100002], A[100002], B[100002];
int main(){
	ios_base::sync_with_stdio(0), cin.tie(0);
	int N, M, Q; cin >> N >> M >> Q;
	for (int i = 1; i < N; ++i) {
		cin >> X[i] >> Y[i];
		edge[X[i]].push_back(Y[i]);
		edge[Y[i]].push_back(X[i]);
	}

	dfs(1, 0);
	seg.init(1, 1, N);
	fill(A, A + N + 1, 1);

	for (int i = 0; i < M; ++i) {
		int j; cin >> j;
		auto &x = X[j], &y = Y[j];
		if (dfn[x] < dfn[y]) swap(x, y);
		if (T[j]) {
			A[x] = B[x] = A[seg.query(1, 1, N, dfn[x], efn[x])];
			seg.update(1, 1, N, dfn[x], efn[x]);
		}
		else {
			seg.update(1, 1, N, dfn[x], 0);
			A[seg.query(1, 1, N, dfn[x], efn[x])] += A[x] - B[x];
		}
		T[j] ^= 1;
	}

	for (int i = 0; i < Q; ++i) {
		int x; cin >> x;
		cout << A[seg.query(1, 1, N, dfn[x], efn[x])] << '\n';
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

synchronization.cpp: In member function 'void ST::init(int, int, int)':
synchronization.cpp:25:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = s + e >> 1;
           ~~^~~
synchronization.cpp: In member function 'void ST::update(int, int, int, int, int)':
synchronization.cpp:37:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
synchronization.cpp: In member function 'int ST::query(int, int, int, int, int)':
synchronization.cpp:46:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...