# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
543423 | Ronin13 | 슈퍼트리 잇기 (IOI20_supertrees) | C++14 | 190 ms | 24116 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "supertrees.h"
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
using namespace std;
int construct(std::vector<std::vector<int>> p) {
int n = p.size();
int lead[n];
for(int i = 0; i < n; i++){
lead[i] = i;
}
for(int i = 0; i < n; i++){
if(p[i][i] != 1)return 0;
for(int j = 0; j < n; j++){
if(p[i][j] != p[j][i]) return 0;
if(p[j][i] == 3)return 0;
}
}
vector< vector <int> > ch(n + 1);
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
if( p[i][j] ){
if(lead[i] != lead[j] && (lead[i] < i || lead[j] != j) )return 0;
lead[i] = lead[j];
}
if((!p[i][j]) && lead[i] == lead[j])return 0;
}
ch[lead[i]].pb(i);
}
vector< vector<int> > cmp;
for(int i = 0; i < n; i++){
if(!ch[i].empty())cmp.pb(ch[i]);
}
for(int i = 0; i < n; i++){
lead[i] = i;
}
vector < vector <int> > ans;
ans.resize(n);
for(int i = 0; i < n; i++){
ans[i].resize(n);
}
vector<vector<int> > cur1;
cur1.resize(n);
for(vector<int> &cur : cmp){
for(int to: cur){
for(int i = 0; i < to; i++){
if(p[to][i] == 1){
if(lead[to] != lead[i] && (lead[to] < to || lead[i] != i) )return 0;
else lead[to] = lead[i];
}
if(p[to][i] == 2){
if(lead[to] == lead[i])return 0;
}
}
cur1[lead[to]].pb(to);
}
vector<int>vv;
for(int to : cur){
// cout << to << ' ';
if(cur1[to].size() == 0)continue;
for(int i = 0; i < cur1[to].size() - 1; i++){
//if(i == 0)vv.pb(cur1[to][i]);
// cout << cur1[to][i] << ' ';
int x = cur1[to][i];
int y = cur1[to][i + 1];
ans[x][y] = ans[y][x] = 1;
}
vv.pb(cur1[to][0]);
}
if(vv.size() == 2)return 0;
if(vv.size() <= 1)continue;
for(int i = 0; i < vv.size() - 1; i++){
int x = vv[i];
int y = vv[i + 1];
// cout << x << ' ' << y << "\n";
ans[x][y] = ans[y][x] = 1;
}
int x = vv.back();
// cout << x;
int y = vv[0];
ans[x][y] = ans[y][x] = 1;
}
/*for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cout << ans[i][j] << " ";
}
cout << "\n";
}*/
build(ans);
return 1;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |