Submission #1367642

#TimeUsernameProblemLanguageResultExecution timeMemory
1367642asli_bgConnecting Supertrees (IOI20_supertrees)C++20
21 / 100
76 ms26124 KiB
#include <bits/stdc++.h>
using namespace std;

//#define int long long

#define fi first
#define se second

#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define sp <<' '<<

#define mid (l+r)/2

#define all(x) x.begin(),x.end()
#define carp(a,b) ((a%MOD)*(b%MOD))%MOD
#define topla(a,b) ((a%MOD)+(b%MOD))%MOD

#define pb push_back

#define DEBUG(x) cout<<#x sp x<<endl;
#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;

typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;
typedef long long ll;
typedef vector<ll> vll;
typedef pair<ll,ll> pll;


const int MAXN=2e5+6;
const int INF=1e9+7;

#include "supertrees.h"

int n;
int r[MAXN], p[MAXN];
vi adj[MAXN];

vector<vi> a;

int find(int a){
    while(a!=p[a]) a=p[a];
    return a;
}

void uni(int a,int b){
    a=find(a);
    b=find(b);
    if(r[a]>r[b]) swap(a,b);
    p[a]=p[b];
    if(r[a]==r[b]) r[b]++;
    r[a]=r[b];
}

bool vis[MAXN];
int son;

void dfs(int nd){
    vis[nd]=true;
    son=nd;
    FOR(i,n){
        if(!vis[i+1] and a[nd-1][i]==2){
            if(find(nd)!=find(i+1)){
                uni(i+1,nd);
                adj[i+1].pb(nd);
                adj[nd].pb(i+1);

                dfs(i+1);
            }
        }
    }
}

vi vec;
bool mark[MAXN];

void dfs2(int nd,int ata){
    vec.pb(nd);
    vis[nd]=true;
    for(auto kom:adj[nd]){
        if(kom==ata or kom==nd) continue;
        if(!vis[kom]) dfs2(kom,nd);
        else{
            while(!vec.empty() and vec.back()!=kom){
                mark[vec.back()]=true;
                vec.pop_back();
            }

            if(!vec.empty()){
                mark[vec.back()]=true;
                vec.pop_back();
            }
        }
    }
    if(!vec.empty()) vec.pop_back();
}

int construct(vector<vi> b){
    n=b.size();
    a=b;

    vector<vi> ans(n,vi(n));

    FORE(i,1,n+1){
        r[i]=0;
        p[i]=i;
        vis[i]=false;
    }

    FOR(i,n){
        FOR(j,n){
            if(a[i][j]==1){
                if(find(i+1)!=find(j+1)){
                    uni(i+1,j+1);
                    adj[i+1].pb(j+1);
                    adj[j+1].pb(i+1);
                }
            }
        }
    }

    FORE(i,1,n+1){
        if(!vis[i]){
            dfs(i);
            adj[son].pb(i);
            adj[i].pb(son);
        }
    }

    FORE(i,1,n+1) vis[i]=false;

    FORE(i,1,n+1){
        if(!vis[i]){
            dfs2(i,-1);
        }
    }

    /*FORE(i,1,n+1){
        DEBUG(i);
        DEBUG(mark[i]);
        cont(adj[i]);
    }*/

    FORE(i,1,n+1){
        for(auto kom:adj[i]){
            if(i!=kom) ans[i-1][kom-1]=1;
        }
    }

    bool f=true;
    FOR(i,n){
        FOR(j,n){
            //if(i==j) continue;

            if(a[i][j]==0){
                if(find(i+1)==find(j+1)){
                    f=false;
                    break;
                }
            }
            else if(a[i][j]==1){
                if(i!=j and (mark[i+1]==true and mark[j+1]==true)){
                    f=false;
                    break;
                }
            }
            else{
                if(find(i+1)!=find(j+1) or (!mark[i+1] and !mark[j+1])){
                    f=false;
                    break;
                }
            }

            //cout<<f<<' ';
        }
        if(!f) break;
        //cout<<endl;
    }

    
    if(f){
        build(ans);
        return 1;
    }

    return 0;

}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...