Submission #590205

#TimeUsernameProblemLanguageResultExecution timeMemory
590205rainboyUplifting Excursion (BOI22_vault)C11
80 / 100
297 ms4424 KiB
#include <stdio.h> #include <string.h> #define N 100 #define INF 0x3f3f3f3f 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; } void update(int *dp, int s_, int a, int k, int c) { static int dq[N * N * 2 + 1], qu[N * N * 2 + 1]; int s, r, head, cnt; if (a > 0) { for (s = 0; s <= s_; s++) dq[s] = dp[s] == -INF ? -INF : dp[s] - s / a * c; for (r = 0; r < a; r++) { head = cnt = 0; for (s = r; s <= s_; s += a) { if (dq[s] != -INF) { while (cnt && dq[qu[head + cnt - 1]] < dq[s]) cnt--; qu[head + cnt++] = s; } dp[s] = cnt == 0 ? -INF : dq[qu[head]] + s / a * c; if (cnt && qu[head] == s - a * k) head++, cnt--; } } } else if (a < 0) { a = -a; for (s = 0; s <= s_; s++) dq[s] = dp[s] == -INF ? -INF : dp[s] + s / a * c; for (r = 0; r < a; r++) { head = cnt = 0; for (s = (s_ - r) / a * a + r; s >= 0; s -= a) { if (dq[s] != -INF) { while (cnt && dq[qu[head + cnt - 1]] < dq[s]) cnt--; qu[head + cnt++] = s; } dp[s] = cnt == 0 ? -INF : dq[qu[head]] - s / a * c; if (cnt && qu[head] == s + a * k) head++, cnt--; } } } else { if (c <= 0) return; for (s = 0; s <= s_; s++) if (dp[s] != -INF) dp[s] += k * c; } } long long solve(long long *kk, int n, long long s_) { static int dp[N * N * 2 + 1], dq[N + 1][N * N + 1]; int a, r1, r2; long long s, s0, s1, s2, lower, upper, k0, ans; for (s = 0; s <= n * n; s++) dp[s] = -INF; dp[0] = 0; for (a = n; a >= 0; a--) { memcpy(dq[a], dp, (n * n + 1) * sizeof *dp); update(dp, n * n, a, min(kk[n + a], n), 1); } for (s = 0; s <= n * n * 2; s++) dp[s] = -INF; dp[n * n + 0] = 0; s0 = 0, k0 = 0; for (a = -n; a < 0; a++) { update(dp, n * n * 2, a, min(kk[n + a], n), -1); s0 += kk[n + a] * a, k0 += kk[n + a]; } ans = -INF; for (a = 0; a <= n; a++) { if (a == 0) { for (s1 = 0; s1 <= n * n * 2; s1++) { s2 = s_ - s0 + s1 - n * n; if (dp[s1] != -INF && s2 >= 0 && s2 <= n * n && dq[a][s2] != -INF) ans = max(ans, k0 + dp[s1] + dq[a][s2] + kk[n + a]); } } else for (r1 = 0; r1 < a; r1++) { r2 = ((s_ - s0 - n * n + r1) % a + a) % a; for (s1 = r1, lower = r2, upper = r2; s1 <= n * n * 2; s1 += a) if (dp[s1] != -INF) { while (lower <= n * n && s0 - s1 + n * n + lower < s_ - kk[n + a] * a) lower += a; while (upper <= n * n && s0 - s1 + n * n + upper <= s_) upper += a; for (s2 = lower; s2 < upper; s2 += a) if (dq[a][s2] != -INF) ans = max(ans, k0 + dp[s1] + dq[a][s2] + (s_ - s0 + s1 - s2 - n * n) / a); } } update(dp, n * n * 2, a, min(kk[n + a], n), -1); s0 += kk[n + a] * a, k0 += kk[n + a]; } return ans; } int main() { static long long kk[N * 2 + 1]; int n, a, r; long long s, ans, tmp; scanf("%d%lld", &n, &s); if (n > N) return 0; for (a = -n; a <= n; a++) scanf("%lld", &kk[n + a]); ans = -INF; for (r = 0; r < 2; r++) { ans = max(ans, solve(kk, n, s)); for (a = 1; a <= n; a++) tmp = kk[n - a], kk[n - a] = kk[n + a], kk[n + a] = tmp; s = -s; } if (ans == -INF) printf("impossible\n"); else printf("%lld\n", ans); return 0; }

Compilation message (stderr)

vault.c: In function 'main':
vault.c:109:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |  scanf("%d%lld", &n, &s);
      |  ^~~~~~~~~~~~~~~~~~~~~~~
vault.c:113:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |   scanf("%lld", &kk[n + a]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...