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>
using namespace std;
#define f first
#define s second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int N;
int dsu[1005];
int sz[1005];
int find(int u){
if(dsu[u] == u)return u;
return dsu[u] = find(dsu[u]);
}
void merge(int u, int v){
u = find(u);
v = find(v);
if(u == v)return;
if(sz[u] < sz[v])swap(u,v);
dsu[v] = u;
sz[u] += sz[v];
}
int construct(vector<vector<int>> p){
N = p.size();
assert(N <= 1000);
bool c0 = false;
bool c1 = false;
bool c2 = false;
bool c3 = false;
for(int i = 0; i < N; i++){
for(int j = 0;j < N; j++){
if(p[i][j] == 0)c0 = true;
if(p[i][j] == 1)c1 = true;
if(p[i][j] == 2)c2 = true;
if(p[i][j] == 3)c3 = true;
}
}
if(!c0 && c1 && !c2 && !c3){
//tree case
vector<vector<int>> b;
for(int i = 0; i < N;i ++){
int c1 = 2*i + 1;
int c2 = 2*i + 2;
int p = (i-1)/2;
if(i == 0)p =-1;
vector<int> curr;
for(int j = 0;j < N; j++){
if(j == p || j == c1 || j== c2){
curr.pb(1);
}
else{
curr.pb(0);
}
}
b.pb(curr);
}
build(b);
return 1;
}
else{
//subtask 2/3
//do dsu
for(int i = 0;i < N; i++){
dsu[i] = i;
sz[i] = 1;
}
for(int i = 0; i < N;i ++){
for(int j = 0;j < N; j++){
if(p[i][j] == 0){
if(find(i) == find(j)){
//not possible
//assert(false);
return 0;
}
}
else{
merge(i, j);
}
}
}
for(int i = 0; i < N;i ++){
assert(find(i) < N && find(i) >= 0);
if(sz[find(i)] == 2 && c2)return 0;
}
//subtask 2
//make a line
vector<vector<int>> edges(N);
for(int i = 0; i < N;i ++){
edges[i].resize(N);
}
int prev[N];
int f[N];
memset(f, -1, sizeof(f));
memset(prev, -1, sizeof(prev));
for(int i = 0; i < N;i ++){
int cmp = find(i);
if(prev[cmp] != -1){
edges[prev[cmp]][i] = 1;
edges[i][prev[cmp]] = 1;
}
if(f[cmp] == -1){
f[cmp] = i;
}
prev[cmp] = i;
}
if(c2){
for(int i = 0; i < N;i ++){
edges[prev[i]][f[i]] = 1;
edges[f[i]][prev[i]] = 1;
}
}
build(edges);
return 1;
}
return 0;
}
# | 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... |