제출 #1304514

#제출 시각아이디문제언어결과실행 시간메모리
1304514hoa208동기화 (JOI13_synchronization)C++20
100 / 100
142 ms19080 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--)
#define pa pair<ll, ll>
#define fi first
#define se second
#define bit(mask, j) ((mask >> j) & 1)
const   ll mod = 1e9 + 7;
const   ll INF = 1e18;
//--------------------------------------------------------------------

ll n, m, q;
const ll N = 2e5 + 10;
vector<ll> g[N];
struct segtree {
	ll mx;
} st[4 * N];
ll arr[N], in[N], en[N];
ll val[N], last[N], par[N];
ll timedfs;
void dfs(ll u, ll p) {
	in[u] = ++timedfs;
	arr[timedfs] = u;
	for(auto v : g[u]) {
		if(v == p) continue;
		par[v] = u;
		dfs(v, u);
	}
	en[u] = timedfs;
}
void update(ll u, ll val, ll id = 1, ll l = 1, ll r = n) {
	if(u < l || u > r) return;
	if(l == r) {
		st[id].mx = val;
		return;
	}
	ll mid = l + r >> 1;
	update(u, val, id << 1, l, mid);
	update(u, val, id << 1 | 1, mid + 1, r);
	st[id].mx = max(st[id << 1].mx, st[id << 1 | 1].mx);
}
void build(ll id = 1, ll l = 1, ll r = n) {
	if(l == r) {
		st[id].mx = en[arr[l]];
		return;
	}
	ll mid = l + r >> 1;
	build(id << 1, l, mid);
	build(id << 1 | 1, mid + 1, r);
	st[id].mx = max(st[id << 1].mx, st[id << 1 | 1].mx);
}
ll walk(ll w, ll u, ll id = 1, ll l = 1, ll r = n) {
	if(st[id].mx < w) return 0;
	if(l == r) return arr[l];
	ll mid = l + r >> 1;
	ll res = 0;
	if(u >= mid + 1) {
		res = walk(w, u, id << 1 | 1, mid + 1, r);
	}
	if(res) return res;
	return walk(w, u, id << 1, l, mid);
}
pa ed[N];
bool dx[N];
ll findset(ll u) {
	return walk(en[u], in[u]);
}
void hbmt() {
	cin >> n >> m >> q;
	FOR(i, 1, n - 1) {
		ll u, v;
		cin >> u >> v;
		ed[i] = {u, v};
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1, 0);
	build();
	FOR(i, 1, n) {
		val[i] = 1;
	}
	FOR(i, 1, m) {
		ll id;
		cin >> id;
		ll u = ed[id].fi, v = ed[id].se;
		if(par[v] != u) swap(u, v);
		if(dx[id] == 0) { // add
			u = findset(u);
			assert(u != 0);
			val[u] += val[v] - last[v];
			update(in[v], 0);
			dx[id] = 1;
		}
		else {
			u = findset(u);
			assert(u != 0);
			val[v] = val[u];
			last[v] = val[v];
			update(in[v], en[v]);
			dx[id] = 0;
		}
	}
	FOR(i, 1, q) {
		ll c;
		cin >> c;
		c = findset(c);
		assert(c != 0);
		cout << val[c] << '\n';
	}
}

int main() {
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);

	#define NAME "hbmt"
	if(fopen(NAME".inp", "r")) {
		freopen(NAME".inp", "r", stdin);
		freopen(NAME".out", "w", stdout);
	}
	
	//int t;cin>>t;while(t--)
	hbmt();
	return 0;
}

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

synchronization.cpp: In function 'int main()':
synchronization.cpp:121:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |                 freopen(NAME".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
synchronization.cpp:122:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |                 freopen(NAME".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...