Submission #1323985

#TimeUsernameProblemLanguageResultExecution timeMemory
1323985ppmn_6철도 요금 (JOI16_ho_t3)C++20
0 / 100
67 ms11136 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
 
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// https://codeforces.com/blog/entry/79148
class Timer: chrono::high_resolution_clock {
    const time_point start_time;
public:
    Timer(): start_time(now()) {}
    rep elapsed_time() const {
		return chrono::duration_cast<chrono::milliseconds>(now() - start_time).count();
	}
} timer;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, m, q;
	cin >> n >> m >> q;
	vector<vector<pair<int, int>>> graph(n + 1);
	vector<int> dist(n + 1), queries(q);
	vector<pair<int, int>> edges(m + 1);
	vector<bool> vis(n + 1, 0), good(m + 1, 1);
	for (int i = 1; i <= m; i++) {
		auto &[u, v] = edges[i];
		cin >> u >> v;
		graph[u].push_back({v, i});
		graph[v].push_back({u, i});
	}
	queue<int> qu;
	qu.push(1);
	vis[1] = 1;
	dist[1] = 0;
	while (qu.size()) {
		int u = qu.front();
		qu.pop();
		for (auto &[v, _] : graph[u]) {
			if (!vis[v]) {
				qu.push(v);
				dist[v] = dist[u] + 1;
				vis[v] = 1;
			}
		}
	}
	for (int i = 0; i < q; i++) {
		cin >> queries[i];
		good[queries[i]] = 0;
	}
	int ans = n - 1;
	vis = vector<bool>(n + 1, 0);
	vis[1] = 1;
	auto upd = [&] (auto self, int u)->void {
		ans--;
		vis[u] = 1;
		for (auto &[v, id] : graph[u]) {
			if (dist[v] == dist[u] + 1 && good[id] && !vis[v]) {
				self(self, v);
			}
		}
	};
	for (int i = 1; i <= m; i++) {
		if (good[i]) {
			auto &[u, v] = edges[i];
			if (dist[u] > dist[v]) {
				swap(u, v);
			}
			if (dist[v] > dist[u] && vis[u]) {
				upd(upd, v);
			}
		}
	}
	vector<int> res;
	res.push_back(ans);
	for (int i = q - 1; i; i--) {
		good[queries[i]] = 1;
		auto &[u, v] = edges[queries[i]];
		if (dist[u] > dist[v]) {
			swap(u, v);
		}
		if (dist[v] > dist[u] && vis[u]) {
			upd(upd, v);
		}
		res.push_back(ans);
	}
	reverse(res.begin(), res.end());
	for (auto &x : res) {
		cout << x << "\n";
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...