제출 #1262777

#제출 시각아이디문제언어결과실행 시간메모리
1262777bot1132조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
0 / 100
18 ms37960 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 77;
#define ll long long
int n,m,f[N],X[N],Y[N],t;
int F(int x) { return x == f[x] ? f[x] : f[x] = F(f[x]); }
set<int> a[N],b[N],u[N],c[N];
ll W,S;

ll Work(int i) {
    int _s = (int)u[i].size();
    return 1ll * _s * (_s - 1 + (int)c[i].size());
}

void Merge(int x,int y) {
    x = F(x);
    y = F(y);
    if (x == y)
        return;

    if (u[x].size() < u[y].size())
        swap(x,y);

    S -= Work(x) + Work(y);
    f[y] = x;

    for (int i : u[y]) { u[x].insert(i), c[x].erase(i); }
    for (int i : c[y]) {
        if (!u[x].count(i))
            c[x].insert(i);
    }
    for (int i : a[y]) {
        if (i != x)
            b[i].erase(y), b[i].insert(x);
        if (!u[x].count(i)) {
            a[x].insert(i);
            if (b[x].count(i))
                ++t, X[t] = x, Y[t] = i;
        }
    }
    for (int i : b[y]) {
        if (i != x)
            a[i].erase(y), a[i].insert(x);
        if (!u[x].count(i)) {
            b[x].insert(i);
            if (a[x].count(i))
                ++t, X[t] = x,Y[t] = i;
        }
    }
    a[y].clear(), b[y].clear(), c[y].clear();
    u[y].clear();
    S += Work(x);
}

int main() {
    scanf("%d",&n);
    for (int i = 1; i <= n; i++) f[i] = i,u[i].insert(i);
    scanf("%d",&m);
    for (int x,y; m--; ) {
        scanf("%d%d",&x,&y);
        int _x = F(x), _y = F(y);
        if (_x == _y) {
            printf("%lld\n",W);
            continue;
        }
        if (a[_x].count(_y)) {
            Merge(x,y);
            while (t) {
                int _X = X[t],_Y = Y[t];
                Merge(_X,_Y);
                t--;
            }
        } else if (!c[_y].count(x)) {
            c[_y].insert(x);
            b[_x].insert(_y);
            a[_y].insert(_x);
            S += (int)u[_y].size();
        }
        W = max(W,S);
        printf("%lld\n",W);
    }
    return 0;
}

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

joitter2.cpp: In function 'int main()':
joitter2.cpp:56:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
joitter2.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |     scanf("%d",&m);
      |     ~~~~~^~~~~~~~~
joitter2.cpp:60:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         scanf("%d%d",&x,&y);
      |         ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...