Submission #1325135

#TimeUsernameProblemLanguageResultExecution timeMemory
1325135opeleklanos슈퍼트리 잇기 (IOI20_supertrees)C++20
56 / 100
108 ms30052 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include "supertrees.h"
using namespace std;


vector<vector<int>> c;
vector<vector<int>> adj;
int n;

int sameT(vector<int> a, vector<int> b){
    for(int i = 0; i<n; i++){
        if(! ((a[i] && b[i]) || (!a[i] && !b[i])) ) return 0;
    }
    return 1;
}

int sm(vector<int> a, vector<int> b){
    for(int i = 0; i<n; i++){
        if(a[i]!=b[i]) return 0;
    }
    return 1;
}



int construct(vector<vector<int>> c1){
    c = c1;
    n = c[0].size();
    adj.assign(n, vector<int>(n, 0));
    for(int i = 0; i<n; i++) c[i].push_back(i);
    sort(c.begin(), c.end());
    int nodeInCurrConp = 0;
    int same = 0;
    
    vector<vector<int>> cycleR;

    
    int ind = 0;
    
    vector<int> check;
    vector<int> seen(n, 0);

    
    while(ind < n){
        check.push_back(ind);
        cycleR.clear();
        cycleR.push_back({c[ind][n]});
        int g = 0;
        ind++;
        
        while(ind<n && sameT(c[ind], c[ind-1])){
            if(sm(c[ind], c[ind-1])){
                cycleR[g].push_back(c[ind][n]);
            }
            else{
                cycleR.push_back({c[ind][n]});
                g++;
            }
            ind++;
        }

        for(int i = 0; i<cycleR.size(); i++){
            for(int j = 0; j<cycleR[i].size(); j++){
                adj[cycleR[i][0]][cycleR[i][j]] = adj[cycleR[i][j]][cycleR[i][0]] = 1;
            }
        }
        for(int i = 0; i<cycleR.size()-1; i++){
            adj[cycleR[i][0]][cycleR[i+1][0]] = adj[cycleR[i+1][0]][cycleR[i][0]] = 1;
        }
        
        adj[cycleR[cycleR.size()-1][0]][cycleR[0][0]] = adj[cycleR[0][0]][cycleR[cycleR.size()-1][0]] = 1;
        for(int i = 0; i<n; i++) adj[i][i] = 0;

        //---------------------------------------------------check
        for(int i = 0; i<cycleR.size(); i++){
            for(int j = 0; j<cycleR[i].size(); j++){
                if(seen[cycleR[i][j]]) return 0;
                seen[cycleR[i][j]] = 1;
            }
        }
        for(int i = 0; i<cycleR.size(); i++){
            vector<int> inThisTeam(n, 0);
            for(int j = 0; j<n; j++){
                if(c1[cycleR[i][0]][j] == 1) inThisTeam[j] = 1;
            }
            for(int j = 0; j<cycleR[i].size(); j++){
                for(int k = 0; k<n; k++){
                    if(c1[cycleR[i][j]][k] == 0 && inThisTeam[k] == 1) return 0;
                    if(c1[cycleR[i][j]][k] == 1 && inThisTeam[k] == 0) return 0;
                }
            }
        }
        //----------------------------------------------------\check
    }
    
    
    seen.assign(n, 0);

    for(int i = 0; i<check.size(); i++){
        for(int j = 0; j<n; j++){
            if(c[check[i]][j] && seen[j]) return 0;
            if(c[check[i]][j]) seen[j] = 1;
        }
    }

    build(adj);
    
    
    return 1;
}

// int main(void){
//         freopen("input.txt", "r", stdin);
//         int n; cin>>n;
//         vector<vector<int>> c1;
//         c1.assign(n, vector<int>(n, 0));
//     for(int i = 0; i<n; i++){
//         for(int j = 0; j<n; j++) cin>>c1[i][j];
//     }
//     construct(c1);
// }
#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...