답안 #994686

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
994686 2024-06-08T03:43:23 Z vjudge1 Pipes (CEOI15_pipes) C++17
100 / 100
1992 ms 9420 KB
#include<bits/stdc++.h>
using namespace std;
#define N 100100
#pragma GCC optimize(2)
#define C cyc.abp
struct unionf{
    int par[N];
    unionf(){
        for(int i=0;i<N;i++)
            par[i]=i;
    }
    int abp(int a){
        return (par[a]-a?par[a]=abp(par[a]):a);
    }
} cyc,comp;
int par[N],sz[N],dep[N];
set<pair<int,int>>st;
vector<pair<int,int>>adj[N];
int depth=0,times=0;
void repos(int x,int p,int d){ 
    par[x]=p,dep[x]=d;
    for(auto[i,j]:adj[x])
        if(C(i)-p&&C(i)!=x)
            repos(C(i),x,d+1);
    depth--;
}
int mergepar(int a){
    times++;
    int b=par[a];
    dep[a]=dep[b];
    par[a]=par[b];
    if(adj[a].size()<adj[b].size())
        swap(a,b);
    cyc.par[b]=a;
    for(auto[i,j]:adj[b])
        if(C(i)-a&&C(i)-b){
            adj[a].push_back({i,j});
            if(C(i)-par[a])
                par[C(i)]=a;
        }
    adj[b].clear();
    return a;
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        sz[i]=1;
    while(m--){
        int a,b;
        cin>>a>>b;
        if(C(a)==C(b))
            continue;
        if(comp.abp(a)==comp.abp(b)){
            int acyc=C(a),bcyc=C(b);
            while(acyc-bcyc){
                if(dep[acyc]<dep[bcyc])
                    swap(acyc,bcyc);
                acyc=mergepar(acyc),
                bcyc=C(bcyc);
            }
        } else {
            int acyc=C(a),bcyc=C(b);
            int acomp=comp.abp(a),bcomp=comp.abp(b);
            if(sz[acomp]<sz[bcomp]) swap(a,b),
                swap(acyc,bcyc),swap(acomp,bcomp);
            sz[acomp]+=sz[bcomp];
            comp.par[bcomp]=acomp;
            repos(bcyc,acyc,dep[acyc]+1);
            adj[acyc].push_back({b,a});
            adj[bcyc].push_back({a,b});
        }
    }
    for(int i=1;i<=n;i++)if(C(i)==i)
        for(auto[j,k]:adj[i]) if(C(j)-i)
            st.insert({min(j,k),max(j,k)});
    for(auto[i,j]:st)
        cout<<i<<' '<<j<<'\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4700 KB Output is correct
2 Correct 1 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4956 KB Output is correct
2 Correct 5 ms 4956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 170 ms 4700 KB Output is correct
2 Correct 155 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 281 ms 4956 KB Output is correct
2 Correct 339 ms 4956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 469 ms 5700 KB Output is correct
2 Correct 409 ms 5968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 611 ms 7724 KB Output is correct
2 Correct 556 ms 7768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 974 ms 8136 KB Output is correct
2 Correct 1012 ms 8136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1268 ms 8904 KB Output is correct
2 Correct 1201 ms 9296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1564 ms 9160 KB Output is correct
2 Correct 1585 ms 9420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1992 ms 8632 KB Output is correct
2 Correct 1890 ms 9056 KB Output is correct