답안 #994683

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
994683 2024-06-08T03:38:36 Z vjudge1 Pipes (CEOI15_pipes) C++17
90 / 100
1883 ms 65536 KB
#include<bits/stdc++.h>
using namespace std;
#define N 100100
#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],ee;
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++;
    if(times>N){
        cout<<"fail (infinite loop)";
        exit(0);
    }
    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;
            ee++;
        }
    ee-=adj[b].size();
    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--){
        if(ee>=2*n){
            cout<<"fail (merged too many times)";
            exit(0);
        }
        int a,b;
        cin>>a>>b;
        if(C(a)==C(b))
            continue;
        if(a==7&&b==5){
            cerr<<"stuff";
        }
        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});
            ee+=2;
        }
    }
    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 4696 KB Output is correct
2 Correct 1 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4952 KB Output is correct
2 Correct 7 ms 4952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 160 ms 4900 KB Output is correct
2 Correct 155 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 280 ms 4952 KB Output is correct
2 Correct 322 ms 4952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 455 ms 5724 KB Output is correct
2 Correct 402 ms 5968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 570 ms 7628 KB Output is correct
2 Correct 505 ms 7764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 913 ms 8136 KB Output is correct
2 Correct 939 ms 8028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1183 ms 8900 KB Output is correct
2 Correct 1126 ms 9224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1475 ms 8904 KB Output is correct
2 Correct 1459 ms 9248 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1840 ms 8836 KB Output is correct
2 Runtime error 1883 ms 65536 KB Memory limit exceeded
3 Halted 0 ms 0 KB -