Submission #905205

#TimeUsernameProblemLanguageResultExecution timeMemory
905205rainboyPower plants (CPSPC17_power)C11
100 / 100
710 ms6828 KiB
#include <stdio.h> #include <string.h> #define N 100000 #define INF 0x3f3f3f3f3f3f3f3fLL unsigned int Z = 12345; int rand_() { return (Z *= 3) >> 1; } int xx[N], yy[N], ii[N], 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 zz[N + 1], ll[N + 1], rr[N + 1], ii_[N + 1], _, u_, l_, r_; int node(int i) { zz[_] = rand_(); ll[_] = rr[_] = 0; ii_[_] = i; return _++; } void split(int u, int i) { int c; if (u == 0) { u_ = l_ = r_ = 0; return; } c = yy[ii_[u]] != yy[i] ? yy[ii_[u]] - yy[i] : ii_[u] - i; if (c < 0) { split(rr[u], i); rr[u] = l_, l_ = u; } else if (c > 0) { split(ll[u], i); ll[u] = r_, r_ = u; } else { u_ = u, l_ = ll[u], r_ = rr[u]; ll[u] = rr[u] = 0; } } int merge(int u, int v) { if (u == 0) return v; if (v == 0) return u; if (zz[u] < zz[v]) { rr[u] = merge(rr[u], v); return u; } else { ll[v] = merge(u, ll[v]); return v; } } void tr_add(int i) { split(u_, i); u_ = merge(merge(l_, node(i)), r_); } void tr_remove(int i) { split(u_, i); u_ = merge(l_, r_); } int ds[N * 2]; int find(int i) { return ds[i] < 0 ? i : (ds[i] = find(ds[i])); } void join(int i, int j) { i = find(i); j = find(j); if (i == j) return; if (ds[i] > ds[j]) ds[i] = j; else { if (ds[i] == ds[j]) ds[i]--; ds[j] = i; } } int join_(int i, int j) { if (find(i << 1 | 0) == find(j << 1 | 0)) return 0; join(i << 1 | 0, j << 1 | 1), join(i << 1 | 1, j << 1 | 0); return 1; } int join1(int u, int j, long long d) { int x, y; if (u == 0) return 1; x = xx[ii_[u]] - xx[j], y = yy[ii_[u]] - yy[j]; if ((long long) y * y >= d) return join1(y < 0 ? rr[u] : ll[u], j, d); else { if ((long long) x * x + (long long) y * y < d && !join_(ii_[u], j)) return 0; return join1(ll[u], j, d) && join1(rr[u], j, d); } } int solve(long long d, int print) { static int ii0[N], ii1[N]; int n0, n1, h, h_, i, j, x; _ = 1, u_ = 0; memset(ds, -1, n * 2 * sizeof *ds); for (h = 0, h_ = 0; h_ < n; h_++) { j = ii[h_]; while (1) { i = ii[h], x = xx[j] - xx[i]; if ((long long) x * x < d) break; tr_remove(i), h++; } if (!join1(u_, j, d)) return 0; tr_add(ii[h_]); } if (print) { n0 = n1 = 0; for (i = 0; i < n; i++) if (find(i << 1 | 0) < find(i << 1 | 1)) ii0[n0++] = i; else ii1[n1++] = i; printf("%lld\n", d); printf("%d\n", n0); for (i = 0; i < n0; i++) printf("%d ", ii0[i] + 1); printf("\n"); printf("%d\n", n1); for (i = 0; i < n1; i++) printf("%d ", ii1[i] + 1); printf("\n"); } return 1; } int main() { int i; long long lower, upper, d2; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d%d", &xx[i], &yy[i]); for (i = 0; i < n; i++) ii[i] = i; sort(ii, 0, n); lower = 1, upper = INF; while (upper - lower > 1) { d2 = (lower + upper) / 2; if (solve(d2, 0)) lower = d2; else upper = d2; } solve(lower, 1); return 0; }

Compilation message (stderr)

Main.c: In function 'main':
Main.c:174:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
Main.c:176:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |   scanf("%d%d", &xx[i], &yy[i]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...