Submission #405161

#TimeUsernameProblemLanguageResultExecution timeMemory
405161rainboyRoller Coaster Railroad (IOI16_railroad)C11
64 / 100
163 ms9672 KiB
#include "railroad_c.h" #include <string.h> #define N 200001 #define SMALL 16 #define INF 0x3f3f3f3f #define LINF 0x3f3f3f3f3f3f3f3f long long min(long long a, long long b) { return a < b ? a : b; } long long max(long long a, long long b) { return a > b ? a : b; } unsigned int X = 12345; int rand_() { return (X *= 3) >> 1; } int xx[N * 2]; 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_] : (ii[j] & 1) - (i_ & 1); 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])); } 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; } } long long plan_roller_coaster(int n, int *aa, int *bb) { if (n <= SMALL) { static long long dp[1 << SMALL][SMALL]; int i, j, b; long long x; for (b = 1; b < 1 << n; b++) memset(dp[b], 0x3f, n * sizeof *dp[b]); for (i = 0; i < n; i++) dp[1 << i][i] = 0; for (b = 1; b < 1 << n; b++) for (i = 0; i < n; i++) { x = dp[b][i]; if (x == LINF) continue; for (j = 0; j < n; j++) if ((b & 1 << j) == 0) dp[b | 1 << j][j] = min(dp[b | 1 << j][j], x + max(bb[i] - aa[j], 0)); } x = LINF; for (i = 0; i < n; i++) x = min(x, dp[(1 << n) - 1][i]); return x; } else { static int ii[N * 2]; int i, d; for (i = 0; i < n; i++) xx[i << 1 | 0] = bb[i], xx[i << 1 | 1] = aa[i]; xx[n << 1 | 0] = 0, xx[n << 1 | 1] = INF; n++; for (i = 0; i < n * 2; i++) ii[i] = i; sort(ii, 0, n * 2); memset(ds, -1, n * sizeof *ds); for (i = 0, d = 0; i < n * 2; i++) { int i_ = ii[i]; d += (i_ & 1) == 0 ? 1 : -1; if (d < 0) return 1; if (d != 0 && i + 1 < n * 2) join(i_ >> 1, ii[i + 1] >> 1); } for (i = 0; i < n; i++) if (find(i) != find(0)) return 1; return 0; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...