Submission #680281

#TimeUsernameProblemLanguageResultExecution timeMemory
680281mjhmjh1104Tortoise (CEOI21_tortoise)C++17
48 / 100
200 ms444556 KiB
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; int n, a[500006], dist[500006], res, dp[306][606][306][2]; vector<int> playgrounds; int pv[500006], nx[500006]; int f(int x, int y, int z, int w) { if (y > 2 * n - 2) return 0; if (dp[x][y][z][w] + 1) return dp[x][y][z][w]; if (w && a[x] == -1) return dp[x][y][z][w] = f(x, y, z, 0); dp[x][y][z][w] = 0; if (w && a[x] != -1) dp[x][y][z][w] = max(dp[x][y][z][w], f(x + 1, y - 1, min(n, max(a[x + 1], 0)), 1)); if (x < n - 1) dp[x][y][z][w] = max(dp[x][y][z][w], f(x + 1, y + 1, min(n, max(a[x + 1], 0)), 0)); if (pv[x] != -1 && z > 0 && y <= 2 * x) { int dist = x - pv[x]; dp[x][y][z][w] = max(dp[x][y][z][w], f(x, y + 2 * dist, z - 1, 0) + 1); } if (nx[x] != -1 && z > 0 && y <= 2 * x) { int dist = nx[x] - x; dp[x][y][z][w] = max(dp[x][y][z][w], f(x, y + 2 * dist, z - 1, 1) + 1); } return dp[x][y][z][w]; } int main() { memset(dp, -1, sizeof dp); scanf("%d", &n); long long sum = 0; for (int i = 0; i < n; i++) { scanf("%d", a + i); sum += max(a[i], 0); dist[i] = (int)1e9; if (a[i] < 0) playgrounds.push_back(i); } for (int i = 0; i < n; i++) { int it = lower_bound(playgrounds.begin(), playgrounds.end(), i) - playgrounds.begin(); if (it == (int)playgrounds.size()) nx[i] = -1; else nx[i] = playgrounds[it]; it = upper_bound(playgrounds.begin(), playgrounds.end(), i) - playgrounds.begin() - 1; if (it == -1) pv[i] = -1; else pv[i] = playgrounds[it]; } { int tmp = (int)1e9; for (int i = 0; i < n; i++) { if (a[i] == -1) tmp = 0; dist[i] = min(dist[i], tmp); tmp++; } tmp = (int)1e9; for (int i = n - 1; i >= 0; i--) { if (a[i] == -1) tmp = 0; dist[i] = min(dist[i], tmp); tmp++; } } printf("%lld", sum - f(0, 0, min(n, max(a[0], 0)), 0)); }

Compilation message (stderr)

tortoise.cpp: In function 'int main()':
tortoise.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
tortoise.cpp:34:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |         scanf("%d", a + i);
      |         ~~~~~^~~~~~~~~~~~~
#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...