제출 #1092715

#제출 시각아이디문제언어결과실행 시간메모리
1092715_rain_Solar Storm (NOI20_solarstorm)C++14
100 / 100
284 ms138176 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define BIT(mask,x) (((mask)>>(x))&(1)) #define MASK(x) (((ll)(1)<<(x))) const int maxn = 1e6; const int maxlog = 20; ll d[maxn+2] , v[maxn+2] , pre[maxn+2] , sum = 0 , k; int s , n; int r[maxn+2] , par[maxn+2][maxlog+2]; int jump(int u , int step){ for (int i = 0; i <= maxlog; ++i) if (BIT(step,i)) u = par[u][i]; return u; } ll Get(int L , int R){ return pre[R]-pre[L-1]; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> s >> k; d[1] = 1; for (int i = 2; i <= n; ++i) { ll x; cin >> x; d[i] = d[i - 1] + x; } for (int i = 1; i <= n; ++i){ cin >> v[i]; pre[i] = pre[i - 1] + v[i]; } r[n+1] = n+1; for (int i = 1 , j = 1; i <= n; ++i){ while (j <= n && d[j] - d[i] <= k) ++j; r[i] = j - 1; } for (int i = 1; i <= n; ++i) { par[i][0] = r[r[i]] + 1; } for (int j = 1; j <= maxlog; ++j){ for (int i = 1; i + MASK(j) - 1 <= n; ++i){ par[i][j] = par[par[i][j-1]][j-1]; } } int source = 1 ; ll total = 0; for (int i = 1; i <= n; ++i){ int L = i , R = jump(i,s) - 1; if (total < Get(L,R)){ total = Get(L,R); source = i; } } // cout << total << ' ' << source << '\n'; vector<int> ans; while (s--){ if (source > n) break; ans.push_back(r[source]); source = par[source][0]; } cout << ans.size() << '\n'; for (auto& x : ans) cout << x << ' '; }
#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...