Submission #1091352

#TimeUsernameProblemLanguageResultExecution timeMemory
1091352Trisanu_DasSolar Storm (NOI20_solarstorm)C++17
100 / 100
260 ms134336 KiB
#include <bits/stdc++.h> using namespace std; const int LOGN = 21, N = 1e6 + 5; #define ll long long ll A[N], prefix[N]; int V[N]; int nxt[N], before[N], parent[LOGN][N]; int n, s, ans_start; ll ans = 0; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int diff; ll k; cin >> n >> s >> k; A[0] = 0; for(int i = 1; i < n; i++) { cin >> diff; A[i] = A[i - 1] + diff; } for(int i = 0; i < n; i++) { cin >> V[i]; prefix[i] = (i == 0 ? 0 : prefix[i - 1]) + V[i]; } prefix[n] = prefix[n - 1]; A[n] = A[n - 1] + 2*k; int current_ptr = 0; nxt[n] = n; for(int i = 0; i < n; i++) { for(int j = current_ptr; j <= n; j++) { if(A[j] - A[i] > k) { current_ptr = j; nxt[i] = j; break; } } } current_ptr = n; for(int i = n; i >= 0; i--) { for(int j = current_ptr; j >= -1; j--) { if(j == -1 or A[i] - A[j] > k) { current_ptr = j; before[i] = j; break; } } } parent[0][n] = n; for(int i = 0; i < n; i++) { int jump_to = nxt[i]; if(jump_to != n) jump_to = nxt[jump_to] - 1; parent[0][i] = jump_to; } for(int i = 1; i < LOGN; i++) for(int j = 0; j <= n; j++) parent[i][j] = parent[i - 1][parent[i - 1][j]]; for(int i = 0; i < n; i++) { int l = before[i], r = i; for(int j = LOGN - 1; j >= 0; j--) if(((1 << j) & (s - 1)) != 0) r = parent[j][r]; ll candidate = prefix[nxt[r] - 1] - (l == -1 ? 0 : prefix[l]); if(candidate > ans) { ans = candidate; ans_start = i; } } vector<int> Q; for(int i = 0; i < s; i++) { Q.push_back(ans_start); ans_start = parent[0][ans_start]; if(ans_start == n) break; } cout << Q.size() << '\n'; for(auto v : Q) cout << v + 1 << ' '; cout << '\n'; }
#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...