제출 #950055

#제출 시각아이디문제언어결과실행 시간메모리
950055irmuun슈퍼트리 잇기 (IOI20_supertrees)C++17
100 / 100
174 ms24292 KiB
#include<bits/stdc++.h>
#include "supertrees.h"

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

struct dsu{
    int n;
    vector<int>sz,par;
    dsu(int n):n(n){
        sz.resize(n);
        par.resize(n);
        fill(all(sz),1);
        iota(all(par),0);
    }
    int find(int x){
        if(par[x]==x) return x;
        return par[x]=find(par[x]);
    }
    void merge(int x,int y){
        x=find(x);
        y=find(y);
        if(x!=y){
            if(sz[x]<sz[y]){
                swap(x,y);
            }
            sz[x]+=sz[y];
            par[y]=x;
        }
    }
    bool same(int x,int y){
        x=find(x);
        y=find(y);
        return x==y;
    }
};

int construct(vector<vector<int>>p){
    int n=p.size();
    dsu ds(n),ds_cmp(n);
    vector<vector<int>>b(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(p[i][j]>0){
                ds_cmp.merge(i,j);
            }
            if(p[i][j]==1){
                if(!ds.same(i,j)){
                    b[i][j]=1;
                    b[j][i]=1;
                    ds.merge(i,j);
                }
            }
        }
    }
    set<int>group[n];
    for(int i=0;i<n;i++){
        group[ds_cmp.find(i)].insert(ds.find(i));
    }
    vector<int>g[n];
    for(int i=0;i<n;i++){
        g[i]=vector<int>(all(group[i]));
        int sz=g[i].size();
        if(sz<2) continue;
        if(sz==2) return 0;
        for(int j=0;j<sz;j++){
            b[g[i][j]][g[i][(j+1)%sz]]=1;
            b[g[i][(j+1)%sz]][g[i][j]]=1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(p[i][j]!=1&&ds.same(i,j)) return 0;
            if(p[i][j]!=2&&p[i][j]!=0&&!ds.same(i,j)) return 0;
            if(p[i][j]==0&&ds_cmp.same(i,j)) return 0;
        }
    }
    build(b);
    return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...