This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/* https://codeforces.com/blog/entry/92083#comment-807698 (frodakcin) */
#include "parks.h"
#include <string.h>
using namespace std;
typedef vector<int> vi;
const int N = 200000;
unsigned int X = 12345;
int rand_() {
return (X *= 3) >> 1;
}
int xx[N], yy[N];
void sort(int *ii, int l, int r) {
while (l < r) {
int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;
while (j < k) {
int c = xx[ii[j]] != xx[i_] ? xx[ii[j]] - xx[i_] : yy[ii[j]] - yy[i_];
if (c == 0)
j++;
else if (c < 0) {
tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
i++, j++;
} else {
k--;
tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
}
}
sort(ii, l, i);
l = k;
}
}
int ds[N];
int find(int i) {
return ds[i] < 0 ? i : (ds[i] = find(ds[i]));
}
int join(int i, int j) {
i = find(i);
j = find(j);
if (i == j)
return 0;
if (ds[i] > ds[j])
ds[i] = j;
else {
if (ds[i] == ds[j])
ds[i]--;
ds[j] = i;
}
return 1;
}
int ii[N], jj[N][4];
int construct_roads(vi xx_, vi yy_) {
int n = xx_.size(), m, i, j, tmp;
vi uu(n - 1), vv(n - 1), aa(n - 1), bb(n - 1);
for (i = 0; i < n; i++)
xx[i] = xx_[i] / 2, yy[i] = yy_[i] / 2, ii[i] = i;
sort(ii, 0, n);
for (i = 0; i < n; i++)
jj[i][0] = jj[i][1] = jj[i][2] = jj[i][3] = -1;
for (i = 1; i < n; i++)
if (xx[ii[i - 1]] == xx[ii[i]] && yy[ii[i - 1]] + 1 == yy[ii[i]])
jj[ii[i - 1]][0] = ii[i], jj[ii[i]][2] = ii[i - 1];
for (i = 0; i < n; i++)
tmp = xx[i], xx[i] = yy[i], yy[i] = tmp;
sort(ii, 0, n);
for (i = 1; i < n; i++)
if (xx[ii[i - 1]] == xx[ii[i]] && yy[ii[i - 1]] + 1 == yy[ii[i]])
jj[ii[i - 1]][1] = ii[i], jj[ii[i]][3] = ii[i - 1];
for (i = 0; i < n; i++)
tmp = xx[i], xx[i] = yy[i], yy[i] = tmp;
memset(ds, -1, n * sizeof *ds);
m = 0;
for (i = 0; i < n; i++) {
if ((j = jj[i][0]) != -1) {
if ((xx[i] + yy[i]) % 2 == 0) {
if (join(i, j))
uu[m] = i, vv[m] = j, aa[m] = xx[i] + xx[j] + 1, bb[m] = yy[i] + yy[j], m++;
} else {
if ((jj[i][3] == -1 || jj[j][3] == -1) && join(i, j))
uu[m] = i, vv[m] = j, aa[m] = xx[i] + xx[j] - 1, bb[m] = yy[i] + yy[j], m++;
}
}
if ((j = jj[i][1]) != -1) {
if ((xx[i] + yy[i]) % 2 == 0) {
if (join(i, j))
uu[m] = i, vv[m] = j, aa[m] = xx[i] + xx[j], bb[m] = yy[i] + yy[j] - 1, m++;
} else {
if ((jj[i][0] == -1 || jj[j][0] == -1) && join(i, j))
uu[m] = i, vv[m] = j, aa[m] = xx[i] + xx[j], bb[m] = yy[i] + yy[j] + 1, m++;
}
}
}
for (i = 0; i < n; i++)
if (find(i) != find(0))
return 0;
build(uu, vv, aa, bb);
return 1;
}
# | 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... |