Submission #98830

#TimeUsernameProblemLanguageResultExecution timeMemory
98830MvCHomecoming (BOI18_homecoming)C++11
13 / 100
103 ms8312 KiB
#include "homecoming.h" #include <bits/stdc++.h> using namespace std; void subtaskAsserts(int N, int K, int a[], int b[]) { assert(N <= 500); } typedef long long int lint; const int NMAX = 2000000; const int VALMAX = 1000000000; void asserts(int N, int K, int a[], int b[]) { assert(1 <= K && K <= N && N <= NMAX); for (int i = 0; i < N; ++ i) { assert(0 <= a[i] && a[i] <= VALMAX); assert(0 <= b[i] && b[i] <= VALMAX); } } int A[2 * NMAX + 5], B[2 * NMAX + 5]; lint dp[2 * NMAX + 5]; lint solve(int N, int K, int a[], int b[]) { asserts(N, K, a, b), subtaskAsserts(N, K, a, b); // Copy and double a, b for internal use for (int i = 0; i < N; ++ i) { A[i] = a[i], A[N + i] = a[i]; B[i] = b[i], B[N + i] = b[i]; } // Try to take all textbooks lint ans = 0; for (int i = 0; i < N; ++ i) ans += A[i] - B[i]; // Fix a textbook we'll NOT take for (int i = 0; i < N; ++ i) { dp[i + N] = 0; for (int j = i + N - 1; j >= i + 1; -- j) { dp[j] = dp[j + 1]; lint cost = 0; for (int k = j; k <= j + K - 2; ++ k) cost -= B[k]; for (int k = j + K - 1; k < i + N; ++ k) { cost += A[k - K + 1] - B[k]; dp[j] = max(dp[j], cost + dp[k + 1]); } } ans = max(ans, dp[i + 1]); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...