Submission #544446

#TimeUsernameProblemLanguageResultExecution timeMemory
544446rainboyRLE (BOI06_rle)C11
100 / 100
504 ms56328 KiB
#include <stdio.h> #define N 2000000 #define M 100000 int min(int a, int b) { return a < b ? a : b; } int iq[1 + M], pq[M], cnt, dp[M]; int lt(int i, int j) { return dp[i] < dp[j]; } int p2(int p) { return (p *= 2) > cnt ? 0 : p < cnt && lt(iq[p + 1], iq[p]) ? p + 1 : p; } void pq_up(int i) { int p, q, j; for (p = pq[i]; (q = p / 2) && lt(i, j = iq[q]); p = q) iq[pq[j] = p] = j; iq[pq[i] = p] = i; } void pq_dn(int i) { int p, q, j; for (p = pq[i]; (q = p2(p)) && lt(j = iq[q], i); p = q) iq[pq[j] = p] = j; iq[pq[i] = p] = i; } int pq_first() { return iq[1]; } int main() { static int hh[N], hh_[N]; static long long kk[N]; int n, n_, m, h, i, sum; scanf("%d%d", &m, &n); for (i = 0; i < n; i++) scanf("%d", &hh[i]); n_ = 0; for (h = 0, i = 0; i < n; i++) if (hh[i] != h) hh[n_] = hh[i], kk[n_] = 1, n_++; else { if (hh[i + 1] == h) hh[n_] = h, kk[n_] = hh[i + 2] + 1, n_++; else if (hh[i + 2] == 0) h = hh[i + 1]; else hh[n_] = hh[i + 1], kk[n_] = hh[i + 2] + 3, n_++; i += 2; } n = n_, n_ = 0; for (i = 0; i < n; i++) if (n_ == 0 || hh[n_ - 1] != hh[i]) hh[n_] = hh[i], kk[n_] = kk[i], n_++; else kk[n_ - 1] += kk[i]; n = n_; for (h = 0; h < m; h++) iq[pq[h] = ++cnt] = h; sum = 0; for (i = n - 1; i >= 0; i--) { int k, k_, h, h_; k = kk[i] / (m + 2) * 3 + min(kk[i] % (m + 2), 3), k_ = (kk[i] + m - 1) / m * 3; sum += k; h = hh[i]; dp[h] += k_ - k, pq_dn(h); h_ = pq_first(); if (dp[h] > dp[h_] + 3) { hh_[i] = h_; dp[h] = dp[h_] + 3, pq_up(h); } else hh_[i] = -1; } printf("%d\n", sum + dp[0]); for (h = 0, i = 0; i < n; i++) { if (hh[i] == h && hh_[i] != -1) printf("%d %d 0 ", h, hh_[i]), h = hh_[i]; if (hh[i] != h) { while (kk[i] >= m + 2) { printf("%d %d %d ", h, hh[i], m - 1); kk[i] -= m + 2; } if (kk[i] <= 3) while (kk[i]--) printf("%d ", hh[i]); else printf("%d %d %lld ", h, hh[i], kk[i] - 3); } else { while (kk[i] >= m) { printf("%d %d %d ", h, h, m - 1); kk[i] -= m; } if (kk[i] > 0) printf("%d %d %lld ", h, h, kk[i] - 1); } } printf("\n"); return 0; }

Compilation message (stderr)

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