제출 #1355261

#제출 시각아이디문제언어결과실행 시간메모리
1355261gay철도 요금 (JOI16_ho_t3)C++20
0 / 100
50 ms17780 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

vector<ll> p, sz;

ll get(ll x) {
    if (p[x] == x) return p[x];
    return p[x] = get(p[x]);
}

void join(ll x, ll y) {
    x = get(x), y = get(y);
    if (x == y) return;
    sz[x] += sz[y]; p[y] = x;
}

void solve() {
    ll n, m, q;
    cin >> n >> m >> q;
    p.resize(n), sz.resize(n, 1);
    iota(p.begin(), p.end(), 0);
    vector<vector<ll>> g(n);
    vector<pair<ll, ll>> edges;
    for (int i = 0; i < m; i++) {
        ll a, b; cin >> a >> b; a--, b--;
        g[a].push_back(b);
        g[b].push_back(a);
        edges.emplace_back(a, b);
    }
    queue<ll> bfs; bfs.push(0);
    vector<ll> dist(n, -1); dist[0] = 0;
    while (!empty(bfs)) {
        ll v = bfs.front(); bfs.pop();
        for (auto u : g[v]) {
            if (dist[u] == -1) {
                dist[u] = dist[v] + 1;
                bfs.emplace(u);
            }
        }
    }
    vector<ll> add, del(m);
    for (int i = 0; i < q; i++) {
        ll id; cin >> id; id--; add.push_back(id); del[id] = 1;
    }
    reverse(add.begin(), add.end());
    vector<ll> hv(m);
    for (int i = 0; i < m; i++) {
        auto [a, b] = edges[i];
        if (dist[a] == dist[b] + 1 || dist[b] == dist[a] + 1) {
            hv[i] = 1;
            if (del[i]) continue;
            join(a, b);
        }
    }
    vector<ll> ans(q);
    for (int i = 0; i < q; i++) {
        ans[q - i - 1] = n - sz[get(0)];
        if (hv[add[i]]) join(edges[add[i]].first, edges[add[i]].second);
    }
    for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...