제출 #979030

#제출 시각아이디문제언어결과실행 시간메모리
979030The_Samurai조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++17
0 / 100
0 ms348 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;

ll get(int l, int r = -1) {
    if (r == -1) return 1ll * l * (l + 1) / 2;
    return 1ll * (r - l + 1) * (l + r) / 2;
}

void solve() {
    int n, m;
    cin >> n >> m;
    ll ans = 0;
    vector<vector<int>> have(n + 1);
    vector<set<int>> in(n + 1), out(n + 1);
    set<pair<int, int>> adj;
    vector<int> weight(n + 1, 2), par(n + 1);
    for (int i = 1; i <= n; i++) have[i].emplace_back(i);
    iota(par.begin(), par.end(), 0);
    auto merge = [&](auto &merge, int u, int v) -> void {
        u = par[u], v = par[v];
        if (weight[u] < weight[v]) swap(u, v);
        ans -= 1ll * have[u].size() * (have[u].size() - 1);
        ans -= 1ll * have[v].size() * (have[v].size() - 1);
        for (int x: in[u]) {
            ans -= have[u].size();
        }
        weight[u] -= have[u].size() + in[u].size();
        // cout << u << ' ' << v << endl;
        queue<pair<int, int>> q;
        for (int x: in[v]) {
            ans -= have[v].size();
            if (par[x] == u) {
                out[x].erase(v);
                weight[u]--;
                continue;
            }
                
            in[u].insert(x);

            if (adj.count(make_pair(par[x], v))) adj.erase(make_pair(par[x], v));
            adj.emplace(par[x], u);
            if (adj.count(make_pair(u, par[x]))) q.emplace(u, par[x]);

            out[x].erase(v);
            out[x].insert(u);
        }
        int old = have[u].size();
        for (int x: have[v]) {
            par[x] = u;
            have[u].emplace_back(x);
            vector<int> del;
            for (int y: out[x]) {
                if (y == u) {
                    del.emplace_back(y);
                    in[u].erase(x);
                } else if (adj.count(make_pair(par[y], u))) {
                    q.emplace(par[y], u);
                }
            }
            for (int y: del) out[x].erase(y);
            weight[u] += out[x].size();
        }
        weight[u] += have[u].size() + in[u].size();
        for (int x: in[u]) ans += have[u].size();
        ans += have[u].size() * (have[u].size() - 1);
        in[v].clear(), have[v].clear();
        while (!q.empty()) {
            auto [u, v] = q.front(); q.pop();
            merge(merge, u, v);
        }
    };
    while (m--) {
        int u, v;
        cin >> u >> v;
        if (par[u] == par[v] or out[u].count(par[v])) {
            cout << ans << '\n';
            continue;
        }
        if (adj.count(make_pair(par[v], par[u]))) {
            merge(merge, u, v);
        } else {
            ans += have[par[v]].size();
            out[u].insert(par[v]);
            in[par[v]].insert(u);
            weight[par[u]]++, weight[par[v]]++;
            adj.emplace(par[u], par[v]);
        }
        cout << ans << '\n';
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(false);

    int queries = 1;

#ifdef sunnatov
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    // cin >> queries;

    for (int test_case = 1; test_case <= queries; test_case++) {
#ifdef sunnatov
        cout << "Test case: " << test_case << endl;
#endif
        solve();
        cout << '\n';
    }

#ifdef sunnatov
    cout << "a";
#endif
}

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

joitter2.cpp: In instantiation of 'solve()::<lambda(auto:23&, int, int)> [with auto:23 = solve()::<lambda(auto:23&, int, int)>]':
joitter2.cpp:81:30:   required from here
joitter2.cpp:25:18: warning: unused variable 'x' [-Wunused-variable]
   25 |         for (int x: in[u]) {
      |                  ^
joitter2.cpp:65:18: warning: unused variable 'x' [-Wunused-variable]
   65 |         for (int x: in[u]) ans += have[u].size();
      |                  ^
joitter2.cpp:48:13: warning: unused variable 'old' [-Wunused-variable]
   48 |         int old = have[u].size();
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...