Submission #590214

#TimeUsernameProblemLanguageResultExecution timeMemory
590214rainboyUplifting Excursion (BOI22_vault)C11
5 / 100
17 ms1068 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], dr[N * N + 1], qu[N * N + 1]; int a, r1, r2, head, cnt, lower, upper; long long s, s0, s2, k0, ans; int s1; 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; head = cnt = 0; 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) { if (cnt && qu[head] == lower) head++, cnt--; lower += a; } while (upper <= n * n && s0 - s1 + n * n + upper <= s_) { dr[upper] = dq[a][upper] == -INF ? -INF : dq[a][upper] - upper / a; if (dr[upper] != -INF && lower <= upper) { while (cnt && dr[qu[head + cnt - 1]] <= dr[upper]) cnt--; qu[head + cnt++] = upper; } upper += a; } if (cnt) ans = max(ans, k0 + dp[s1] + (s_ - s0 + s1 - n * n) / a + dr[qu[head]]); } } 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, subtask1; long long s, ans, tmp; scanf("%d%lld", &n, &s); subtask1 = n <= 50; for (a = -n; a <= n; a++) { scanf("%lld", &kk[n + a]); if (kk[n + a] > 50) subtask1 = 0; } if (!subtask1) return 0; 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:120:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |  scanf("%d%lld", &n, &s);
      |  ^~~~~~~~~~~~~~~~~~~~~~~
vault.c:123:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |   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...