Submission #1291667

#TimeUsernameProblemLanguageResultExecution timeMemory
1291667lambd47Connecting Supertrees (IOI20_supertrees)C++20
100 / 100
103 ms30304 KiB
#include<bits/stdc++.h>
#include "supertrees.h"

using namespace std;
#define ll long long
#define L(i,j,k) for(int i=(j);i<=(k);i++)
#define R(i,j,k) for(int i=(j);i>=(k);i--)
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(),(v).end()

int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
    vector<vector<pair<int,int>>> adj(n);
    vector<vector<int>> answer(n,vector<int> (n,0));
    vector<int> cnt1(n,1);
    L(i,0,n-1){
        if(p[i][i]!=1)return 0;
        L(j,0,n-1){
            if(p[i][j]==3)return 0;
            if(i!=j && p[i][j]!=0){
                adj[i].push_back({j,p[i][j]});
                if(p[i][j]==1)cnt1[i]++;
            }
        }
    }
    vector<vector<int>> grupos;
    int gat=0;
    vector<int> grupo(n,-1);

    auto dfsg=[&](auto&& self, int node,int g)->void{
        grupos.back().push_back(node);
        grupo[node]=g;
        for(auto [a,t]:adj[node]){
            if(grupo[a]==-1){
                self(self,a,g);
            }
        }
        return;
    };
    L(i,0,n-1){
        if(grupo[i]==-1){
            grupos.push_back({});
            dfsg(dfsg,i,gat);
            gat++;
        }
    }
    for(auto& g:grupos){//grupos sao conexos
        for(auto&a :g){
            for(auto&b:g){
                if(p[a][b]==0)return 0;
            }
        }
    }
    vector<int> goat(n,-1);
    vector<vector<int>> sub(n);


    for(auto&g: grupos){
        int cnt=0;
        vector<int> goats;
        for(auto a:g){
            if(goat[a]==-1){
                goats.push_back(a);
                cnt++;
                goat[a]=a;
                sub[a].push_back(a);
                for(auto [b,tipo]:adj[a]){
                    if(tipo!=1)continue;
                    answer[a][b]=answer[b][a]=1;
                    goat[b]=a;
                    sub[a].push_back(b);
                }
            }
        }
        for(auto a:g){
            if(sub[a].empty())continue;
            for(auto b:sub[a]){
                for(auto c:sub[a]){
                    if(p[b][c]!=1)return 0;
                }
                if(cnt1[b]!=sz(sub[a]))return 0;//garanto que o resto estrito eh com 2
            }
        }
        if(cnt==2)return 0;
        if(cnt==1)continue;
        L(i,0,sz(goats)-1){
            int xx=goats[i%sz(goats)];
            int yy=goats[(i+1)%sz(goats)];
            answer[xx][yy]=answer[yy][xx]=1;
        }
    }
	build(answer);
	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...