제출 #853027

#제출 시각아이디문제언어결과실행 시간메모리
853027BenmathHomecoming (BOI18_homecoming)C++14
100 / 100
228 ms188576 KiB
#include<homecoming.h> #include<bits/stdc++.h> using namespace std; long long int calculate (int i, int j, long long int prefiks[]){ if(i == 0){ return prefiks[j]; }else{ return prefiks[j] - prefiks[i-1]; } } long long solve(int N, int K, int *A, int *B){ int n = N; int k = K; long long int a[n]; long long int b[n]; long long int dp[n]; long long int dp1[n]; long long int sum1 = 0; long long int pref1[2*n+1]; long long int pref2[2*n+1]; for(int i = 0; i < n; i++){ a[i] = A[i]; b[i] = B[i]; sum1 = sum1 + a[i] - b[i]; dp[i] = 0; dp1[i] = -1e18; } pref1[0] = a[0]; pref2[0] = b[0]; for(int i = 1; i <= 2*n; i++){ pref1[i] = pref1[i-1] + a[i % n]; pref2[i] = pref2[i-1] + b[i % n]; } long long int ans = 0; ans = max (ans, sum1); // ako ne uzimamo prvi element for(int i = 0; i < n; i++){ if (i == 0){ long long int sum = calculate(i, i + k-1, pref2); dp1[i] = a[i] - sum; // dp[i] = max(dp[i], dp1[i]); dp[i] = 0; dp1[i] = -1e18; }else{ dp[i] = dp[i-1]; long long int sum = calculate(i, i + k - 1, pref2); sum = a[i] - sum; if (i >= k){ dp1[i] = sum + dp[i-k]; }else{ dp1[i] = sum; } dp1[i] = max(dp1[i], dp1[i-1] + a[i] - b[(i + k - 1) % n] ); dp[i] = max(dp[i], dp1[i]); } } ans = max(ans, dp[n-1]); // ako uzimamo prvi element int vis[n]; for (int i = 0; i < n; i++){ dp[i] = -1e18; dp1[i] = -1e18; vis[i] = 0; } for (int i = 0; i < n; i++){ if (i == 0){ long long int sum = 0; sum = calculate(i, i + k-1, pref2); dp1[i] = a[i] - sum; dp[i] = dp1[i]; }else{ if (i >= k){ dp[i] = dp[i-1]; long long int sum = 0; sum = calculate(i, i + k-1, pref2); sum = a[i] - sum; dp1[i] = sum + dp[i-k]; long long int ro = a[i]; ro = ro - b[(i + k - 1) % n]; dp1[i] = max(dp1[i], dp1[i-1] + ro); dp[i] = max(dp[i], dp1[i]); sum = 0; sum = calculate (i, n - 1, pref1) - calculate(i, n - 1, pref2); ans = max(ans, sum + dp[i-k]); }else{ dp[i] = dp[i-1]; long long int ro = a[i]; if(vis[(i + k - 1) % n] == 0){ ro = ro - b[(i + k - 1) % n]; } dp1[i] = dp1[i-1] + ro; dp[i] = max(dp[i], dp1[i]); } } } ans = max(ans, dp[n-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...