제출 #422005

#제출 시각아이디문제언어결과실행 시간메모리
422005OttoTheDino슈퍼트리 잇기 (IOI20_supertrees)C++17
100 / 100
282 ms22368 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
 
#define rep(i,s,e)                  for (int i = s; i <= e; ++i)
typedef vector<int> vi;
 
int construct (vector<vi> p) {
    int n = p.size();
 
    int sup[n], tree[n], spec[n];
    memset(sup,-1,4*n), memset(tree,-1,4*n);
 
    rep (i,0,n-1) {
        if (sup[i]==-1) {
            bool two = 0;
            rep (j,0,n-1) {
                if (p[i][j]==3) return 0;
                if (p[i][j]==1 || p[i][j]==2) {
                    if (sup[i]==-1) sup[i] = sup[j] = j;
                    else sup[j] = sup[i];
                    if (p[i][j]==1) {
                        if (tree[i]==-1) tree[i] = tree[j] = j;
                        else tree[j] = tree[i];
                    }
                    else two = 1;
                }
                else if (i==j) return 0;
            }
            spec[sup[i]] = !two;
        }
        else if (tree[i]==-1) {
            rep (j,0,n-1) {
                if (p[i][j]==3) return 0;
                if (p[i][j]==1 || p[i][j]==2) {
                    if (p[sup[i]][j] != 1 && p[sup[i]][j] != 2) return 0;
                    if (p[i][j]==1) {
                        if (tree[i]==-1) tree[i] = tree[j] = j;
                        else tree[j] = tree[i];
                    }
                }
                else if (p[sup[i]][j]) return 0;
            }
        }
        else rep (j,0,n-1) if (p[tree[i]][j]!=p[i][j]) return 0;
    }
 
    vector<vi> b(n,vi(n,0));
    rep (i,0,n-1) {
        if (i==sup[i]) {
            int last = i, cnt = 0;
            rep (j,0,n-1) {
                if (sup[j]==i && j==tree[j]) cnt++;
                if (i==j || sup[j]!=i) continue;
                if (j==tree[j]) {
                    if (spec[i]) continue;
                    b[j][last] = b[last][j] = 1;
                    last = j;
                }
                else b[j][tree[j]] = b[tree[j]][j] = 1;
            }
            if (last!=i && !spec[i]) b[last][i] = b[i][last] = 1;
            if (!spec[i] && cnt==2) 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...