답안 #978328

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
978328 2024-05-09T06:23:09 Z vjudge1 조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2) C++17
0 / 100
1 ms 348 KB
// MDSPro
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize ("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")

#include "bits/stdc++.h"

using namespace std;

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

void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}

#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#ifdef ONLINE_JUDGE
    #define debug(x...) 42
#endif

const ld PI = 3.141592653589793;
const int MOD = 1e9+7;
const int INF = 1e9;
const ll INFLL = 4e18;
const double EPS = 1e-9;
const int MAXN = 1000*1007;

struct DSU {
    int n;
    vector<int> p, link;
    vector<set<int>> v;
    vector<set<int>> st;
    ll ans;

    DSU(int sz):n(sz) {
        ans = 0;
        p.resize(n); iota(p.begin(), p.end(), 0);
        link.resize(n); iota(link.begin(), link.end(), 0);
        v.resize(n); st.resize(n);
        for(int i = 0; i < n; ++i) v[i].insert(i);
    }

    inline ll contr(int x) {
        int sz = v[x].size();
        int fr = st[link[x]].size();
        return 1LL * sz * (sz - 1 + fr);
    }

    void unite(int a, int b) {
        a = p[a]; b = p[b];
        if(b == a) return;
        
        ans -= contr(a);
        ans -= contr(b);
        
        int la = link[a], lb = link[b];
        if(v[a].size() > v[b].size()) swap(a, b);
        if(st[la].size() > st[lb].size()) swap(la, lb);

        for(int x: st[la]) {
            if(p[x] != b && p[x] != a) st[lb].insert(x);
        }
        st[la].clear();

        for(int x: v[a]) {
            if(st[lb].count(x)) st[lb].erase(x);
            p[x] = b;
            v[b].insert(x);
        }

        v[a].clear();

        link[b] = lb;
        link[a] = 0;

        ans += contr(b);
    }

    void add_edge(int x, int y) {
        y = p[y];
        
        if(p[x] != y) {
           if(!st[link[y]].count(x)) {
                st[link[y]].insert(x);
                ans += v[y].size();
           }
        }
    }

    ll get_ans() {
        return ans;
    }

    void print() {
        for(int i = 1; i < n; ++i) {
            debug(i, link[i]);
            debug(v[i]);
            debug(st[link[i]]);
        }
        debug(ans);
    }
};

void solve(int NT){
    int n, m; cin >> n >> m;

    DSU dsu(n + 1);
    set<pair<int, int>> st;
        dsu.print();
        cerr << '\n';
    for(int i = 0; i < m; ++i) {
        int x, y; cin >> x >> y;
        st.insert({x, y});

        if(st.count({y, x})) dsu.unite(x, y); 
        else dsu.add_edge(x, y);

        cout << dsu.get_ans() << '\n';
    }
}

// #define TESTCASES
int main() {
    cin.tie(0)->sync_with_stdio(0);

    int t = 1;
    #ifdef TESTCASES
        cin >> t;
    #endif
    
    for(int i = 1; i <= t; ++i){
        solve(i);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -