Submission #1180000

#TimeUsernameProblemLanguageResultExecution timeMemory
1180000pcheloveksHomecoming (BOI18_homecoming)C++20
0 / 100
160 ms327680 KiB
//#pragma GCC optimize("Ofast") //#pragma GCC optimize ("unroll-loops") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4") //#pragma GCC target("bmi,bmi2,popcnt,lzcnt") #include "homecoming.h" #include <iostream> #include <vector> #include <string> #include <map> #include <set> #include <cmath> #include <fstream> #include <climits> #include <queue> #include <algorithm> #include <stdint.h> #include <stack> #include <iomanip> #include <unordered_set> #include <unordered_map> #include <cstring> // Для memset #define endl '\n' using namespace std; typedef long long ll; typedef long double ld; typedef pair <ll, ll> pii; typedef pair <ld, ld> pdd; const ll DIM = 700007; const ll MXMASK = (1 << 21); const ll INF = 1e18; const ll mod = 998244353; const ld eps = 0.00000000001; const ld gr = (sqrt(5) + 1) / 2; const ll offset = 10000; const ll Bits = 20; const ll dx[4] = { 1, 0, -1, 0 }; const ll dy[4] = { 0, 1, 0, -1 }; FILE* stream; long long int solve(int N, int K, int* A, int* B) { vector<vector<vector<ll>>> F(2, vector<vector<ll>>(2 * N + 7, vector<ll>(2 * N + 7, 0))); vector < ll > p(2 * N + 1, 0); long long int res = 0; if (K != 1) { p[0] = B[0]; for (int i = 1; i < 2 * N; i++) { if (i < N) p[i] = p[i - 1] + B[i]; else p[i] = p[i - 1] + B[i - N]; } for (int L = 2 * N - 1; L >= 0; L--) { for (int R = L; R < 2 * N; R++) { if (R - L + 1 < K || R - L + 1 > N) continue; else if (R - L + 1 == K) { F[0][L][R] = 0; if (L != 0) F[1][L][R] = p[R] - p[L - 1]; else F[1][L][R] = p[R]; F[1][L][R] *= -1; if (L < N) F[1][L][R] += A[L]; else F[1][L][R] += A[L - N]; } else { for (int x = L + 1; x <= R; x++) { F[0][L][R] = max(F[0][L][R], max(F[0][x][R], F[1][x][R])); } ll a, b; if (L < N) a = A[L]; else a = A[L - N]; if (L < N) b = B[L]; else b = B[L - N]; F[1][L][R] = F[1][L + 1][R] + a - b; for (int x = L + K; x <= R; x++) { if (L != 0) F[1][L][R] = max(F[1][L][R], -(p[L + K - 1] - p[L - 1]) + a + max(F[0][x][R], F[1][x][R])); else F[1][L][R] = max(F[1][L][R], -(p[L + K - 1]) + a + max(F[0][x][R], F[1][x][R])); } } if (R - L + 1 == N) { res = max(res, F[0][L][R]); res = max(res, F[1][L][R]); } cout << L << " " << R << " " << F[0][L][R] << endl; } } } else { for (int i = 0; i < N; i++) { if (A[i] - B[i] >= 0) res += A[i] - B[i]; } } return res; } /* 3 2 40 80 100 140 0 20 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...