Submission #452092

#TimeUsernameProblemLanguageResultExecution timeMemory
452092rainboy식물 비교 (IOI20_plants)C++17
0 / 100
1 ms384 KiB
#include "plants.h" #include <stdlib.h> #include <string.h> using namespace std; typedef vector<int> vi; const int N = 200000, N_ = 1 << 18, INF = 0x3f3f3f3f; int max(int a, int b) { return a > b ? a : b; } int pp[N], hh[N], n, k; int st[N_ * 2], lz[N_ * 2], first[N_ * 2], last[N_ * 2], gap[N_ * 2], n_; void put(int i, int x) { st[i] += x, lz[i] += x; } void pul(int i) { int l = i << 1, r = l | 1; if (st[l] < st[r]) st[i] = st[l], first[i] = first[l], last[i] = last[l], gap[i] = gap[l]; else if (st[l] > st[r]) st[i] = st[r], first[i] = first[r], last[i] = last[r], gap[i] = gap[r]; else st[i] = st[l], first[i] = first[l], last[i] = last[r], gap[i] = max(max(gap[l], gap[r]), first[r] == first[r] - last[l]); st[i] += lz[i]; } void pull(int i) { while (i > 1) pul(i >>= 1); } void build(vi aa, int n) { int i; n_ = 1; while (n_ < n) n_ <<= 1; memset(lz, 0, n_ * 2 * sizeof *lz); for (i = 0; i < n_; i++) { st[n_ + i] = i < n ? aa[i] : INF, gap[n_ + i] = 0; first[n_ + i] = last[n_ + i] = i; } for (i = n_ - 1; i > 0; i--) pul(i); } void update(int l, int r, int x) { int l_ = l += n_, r_ = r += n_; for ( ; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) put(l++, x); if ((r & 1) == 0) put(r--, x); } pull(l_), pull(r_); } int get(int k) { int i = 1; if (gap[1] < k) return first[1]; while (i < n_) if (st[i] == st[i << 1 | 0] + lz[i] && gap[i << 1 | 0] >= k) i = i << 1 | 0; else if (st[i] == st[i << 1 | 1] + lz[i] && gap[i << 1 | 1] >= k) i = i << 1 | 1; else return first[i << 1 | 1]; return -1; } int next(int l) { int i = 1; if (l >= last[1]) return first[1]; while (i < n_) if (st[i] == st[i << 1 | 0] + lz[i] && l < last[i << 1 | 0]) i = i << 1 | 0; else i = i << 1 | 1; return i - n_; } int prev(int r) { int i = 1; if (r <= first[1]) return last[1]; while (i < n_) if (st[i] == st[i << 1 | 1] + lz[i] && r > first[i << 1 | 1]) i = i << 1 | 1; else i = i << 1 | 0; return i - n_; } int *ej[N], eo[N]; void append(int i, int j) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) ej[i] = (int *) realloc(ej[i], o * 2 * sizeof *ej[i]); ej[i][o] = j; } char root[N]; int ta[N], tb[N]; void dfs(int p, int i) { static int time; int o; ta[i] = time++; for (o = eo[i]; o--; ) { int j = ej[i][o]; if (j != p) dfs(i, j); } tb[i] = time; } void init(int k_, vi rr) { int h, i; n = rr.size(), k = k_; build(rr, n); for (i = 0; i < n; i++) ej[i] = (int *) malloc(2 * sizeof *ej[i]); memset(root, 1, n * sizeof *root); for (h = n - 1; h >= 0; h--) { int p, q; i = get(k); update(i, i, INF); if (i >= k - 1) update(i - k + 1, i, -1); else update(0, i, -1), update(i - k + 1 + n, n - 1, -1); if (h > 0) { q = next(i), p = prev(q); if (q == p || (q - p + n) % n >= k) append(q, i), root[i] = 0; q = next((i - k + n) % n), p = prev(q); if ((i - q + n) % n < k && (q == p || (q - p + n) % n >= k)) append(q, i), root[i] = 0; } } for (i = 0; i < n; i++) if (root[i]) dfs(-1, i); } int compare_plants(int x, int y) { if (ta[x] <= ta[y] && ta[y] < tb[x]) return -1; else if (ta[y] <= ta[x] && ta[x] < tb[y]) return 1; else return 0; }

Compilation message (stderr)

plants.cpp: In function 'void append(int, int)':
plants.cpp:111:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
  111 |  if (o >= 2 && (o & o - 1) == 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...