#include "parks.h"
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define ar array
#define pb push_back
#define ln '\n'
//#define int long long
using i64 = long long;
template <class F, class _S>
bool chmin(F &u, const _S &v){
bool flag = false;
if ( u > v ){
u = v; flag |= true;
}
return flag;
}
template <class F, class _S>
bool chmax(F &u, const _S &v){
bool flag = false;
if ( u < v ){
u = v; flag |= true;
}
return flag;
}
struct Dsu{
vector <int> fa;
int n;
Dsu(int n) : n(n) {
fa.resize(n);
iota(all(fa), 0);
}
int get(int u){
return u ^ fa[u] ? fa[u] = get(fa[u]) : u;
}
bool merge(int u, int v){
u = get(u), v = get(v);
if ( u == v ) return false;
fa[v] = u;
return true;
}
};
mt19937 rng(chrono::steady_clock().now().time_since_epoch().count());
#define rnd(l, r) uniform_int_distribution <int> (l, r)(rng)
int dx[] = {2, -2, 0, 0};
int dy[] = {0, 0, -2, 2};
int construct_roads(std::vector<int> x, std::vector<int> y) {
int n = x.size();
map <int,map<int,int>> id;
for ( int i = 0; i < n; i++ ){
id[x[i]][y[i]] = i;
}
vector <ar<int,2>> e, E;
map <ar<int,2>,int> mp;
vector <vector<int>> G(n);
for ( int i = 0; i < n; i++ ){
for ( int j = 0; j < 4; j++ ){
int u = x[i] + dx[j], v = y[i] + dy[j];
if ( !id[u].count(v) ) continue;
E.pb({i, id[u][v]});
}
}
auto f = [&](int i, int j){
return y[i] == y[j];
};
sort(all(E), [&](auto &u, auto &v){
auto [i, j] = u;
auto [x_, y_] = v;
if ( f(i, j) != f(x_, y_) ){
return f(i, j) < f(x_, y_);
}
if ( !f(i, j) ){
return true;
}
return x[i] < x[x_];
});
Dsu ds(n);
for ( auto &[u, v]: E ){
if ( ds.merge(u, v) ){
e.pb({u, v});
mp[{v, u}] = mp[{u, v}] = (int)e.size() - 1;
}
}
if ( (int)e.size() != n - 1 ){
return 0;
}
//~ for ( int i = 0; i + 1 < n; i++ ){
//~ cout << e[i][0] << ' ' << e[i][1] << " " << i << ln;
//~ } cout << ln;
vector <vector<int>> adj(n * 2), rev(n * 2);
auto add = [&](int u, int v){
//~ cout << u << " " << v << ln;
adj[u].pb(v);
rev[v].pb(u);
};
for ( int i = 0; i < n - 1; i++ ){
auto [u, v] = e[i];
if ( x[u] == x[v] ){ // vertical
if ( y[u] > y[v] ) swap(u, v);
{ // 0
int a = -1, b = -1;
if ( id[x[u] + 2].count(y[u]) ){
int j = id[x[u] + 2][y[u]]; a = j;
if ( mp.count({u, j}) ){
int k = mp[{u, j}];
add(i, k);
}
}
if ( id[x[u] + 2].count(y[v]) ){
int j = id[x[u] + 2][y[v]]; b = j;
if ( mp.count({j, v}) ){
int k = mp[{j, v}];
add(i, k + n);
}
}
if ( mp.count({a, b}) ){
add(i, mp[{a, b}]);
}
}
{ // 1
int a = -1, b = -1;
if ( id[x[u] - 2].count(y[u]) ){
int j = id[x[u] - 2][y[u]]; a = j;
if ( mp.count({u, j}) ){
int k = mp[{u, j}];
add(i + n, k);
}
}
if ( id[x[u] - 2].count(y[v]) ){
int j = id[x[u] - 2][y[v]]; b = j;
if ( mp.count({j, v}) ){
int k = mp[{j, v}];
add(i + n, k + n);
}
}
if ( mp.count({a, b}) ){
add(i + n, mp[{a, b}] + n);
}
}
} else{ // horizontal
if ( x[u] > x[v] ) swap(u, v);
{ // 0
int a = -1, b = -1;
if ( id[x[u]].count(y[u] - 2) ){
int j = id[x[u]][y[u] - 2]; a = j;
if ( mp.count({u, j}) ){
int k = mp[{u, j}];
add(i, k + n);
}
}
if ( id[x[v]].count(y[v] - 2) ){
int j = id[x[v]][y[v] - 2]; b = j;
if ( mp.count({j, v}) ){
int k = mp[{j, v}];
add(i, k);
}
}
if ( mp.count({a, b}) ){
add(i, mp[{a, b}]);
}
}
{ // 1
int a = -1, b = -1;
if ( id[x[u]].count(y[u] + 2) ){
int j = id[x[u]][y[u] + 2]; a = j;
if ( mp.count({u, j}) ){
int k = mp[{u, j}];
add(i + n, k + n);
}
}
if ( id[x[v]].count(y[v] + 2) ){
int j = id[x[v]][y[v] + 2]; b = j;
if ( mp.count({j, v}) ){
int k = mp[{j, v}];
add(i + n, k);
}
}
if ( mp.count({a, b}) ){
add(i + n, mp[{a, b}] + n);
}
}
}
}
vector <int> ord, us(n * 2);
auto dfs = [&](auto dfs, int u) -> void{
if ( us[u] ) return;
us[u] = true;
for ( auto &v: adj[u] ){
dfs(dfs, v);
}
ord.pb(u);
};
for ( int i = 0; i < n * 2; i++ ){
dfs(dfs, i);
}
reverse(all(ord));
vector <int> c(n * 2, -1);
int ct = 0;
auto trav = [&](auto trav, int u) -> void{
if ( c[u] != -1 ) return;
c[u] = ct;
for ( auto &v: rev[u] ){
trav(trav, v);
}
};
for ( auto &u: ord ){
if ( c[u] != -1 ) continue;
trav(trav, u);
ct++;
}
vector <int> t(n - 1);
for ( int i = 0; i + 1 < n; i++ ){
if ( c[i] == c[i + n] ){
return 0;
}
t[i] = (c[i] < c[i + n]);
}
vector <int> U, V, A, B;
set <pair<int,int>> st;
for ( int i = 0; i + 1 < n; i++ ){
auto [u, v] = e[i];
U.pb(u), V.pb(v);
if ( x[u] == x[v] ){
if ( y[u] > y[v] ) swap(u, v);
A.pb(x[u] + (t[i] ? -1 : 1));
B.pb(y[u] + 1);
} else{
if ( x[u] > x[v] ) swap(u, v);
A.pb(x[u] + 1);
B.pb(y[u] + (t[i] ? 1 : -1));
}
assert(!st.count({A.back(), B.back()}));
st.insert({A.back(), B.back()});
}
build(U, V, A, B);
return 1;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
0 ms |
356 KB |
Output is correct |
3 |
Correct |
0 ms |
356 KB |
Output is correct |
4 |
Correct |
0 ms |
356 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Runtime error |
97 ms |
22140 KB |
Execution killed with signal 11 |
10 |
Halted |
0 ms |
0 KB |
- |