Submission #1312981

#TimeUsernameProblemLanguageResultExecution timeMemory
1312981codergConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
114 ms22200 KiB
#include "bits/stdc++.h"
#include "supertrees.h"
using namespace std;
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define pb push_back
void setIO(string name = ""){if(name.size()){ freopen((name + ".in").c_str(), "r", stdin);freopen((name + ".out").c_str(), "w", stdout);}}
#define F(i,l,r) for(int i=(l);i<(r);++i)
#define FR(i,l,r) for(int i=(l);i>=(r);--i)
typedef long long ll;

const int maxn=(1<<20);
const int mod=1e9+7;
const int mox=2000*500+505;
const int inf=1e9;

struct DSU{
    vector<int> par;
    DSU(int n){
        par.resize(n);
        iota(par.begin(),par.end(),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)par[x]=y;
    }
};

int construct(vector<vector<int>> p){
    int n=p.size();
    vector<vector<int> > b(n,vector<int>(n,0));
    F(i,0,n){
        F(j,0,n)if(p[i][j]==3)return 0;
    }
    DSU uf1(n);
    F(i,0,n){
        F(j,0,n){
            if(p[i][j])uf1.merge(i,j);
        }
    }
    F(i,0,n){
        F(j,0,n){
            if((uf1.find(i)==uf1.find(j))!=(p[i][j]>0))return 0;
        }
    }
    vector<vector<int> > comps(n);
    F(i,0,n)comps[uf1.find(i)].pb(i);
    F(c,0,n){
        if(comps[c].empty())continue;
        const vector<int>& nodes=comps[c];
        DSU uf2(n);
        for(int i:nodes){
            for(int j:nodes){
                if(p[i][j]==1)uf2.merge(i,j);
            }
        }
        vector<int> reps;
        vector<bool> seen(n,0);
        for(int i:nodes){
            int rt=uf2.find(i);
            if(!seen[rt]){
                seen[rt]=1;
                reps.pb(rt);
                vector<int> group;
                for(int j:nodes){
                    if(uf2.find(j)==rt)group.pb(j);
                }
                for(int k=0;k+1<group.size();++k){
                    int u=group[k],v=group[k+1];
                    b[u][v]=b[v][u]=1;
                }
            }
        }
        for(int i:nodes){
            for(int j:nodes){
                if(uf2.find(i)==uf2.find(j)){
                    if(p[i][j]!=1)return 0;
                }else{
                    if(p[i][j]!=2)return 0;
                }
            }
        }
        int m=reps.size();
        if(m==2)return 0;
        if(m>=3){
            F(k,0,m){
                int u=reps[k],v=reps[(k+1)%m];
                b[u][v]=b[v][u]=1;
            }
        }
    }
    build(b);
    return 1;
}

Compilation message (stderr)

supertrees.cpp: In function 'void setIO(std::string)':
supertrees.cpp:11:54: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 | void setIO(string name = ""){if(name.size()){ freopen((name + ".in").c_str(), "r", stdin);freopen((name + ".out").c_str(), "w", stdout);}}
      |                                               ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
supertrees.cpp:11:98: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 | void setIO(string name = ""){if(name.size()){ freopen((name + ".in").c_str(), "r", stdin);freopen((name + ".out").c_str(), "w", stdout);}}
      |                                                                                           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...