제출 #1317431

#제출 시각아이디문제언어결과실행 시간메모리
1317431darlanfrancaHacker (BOI15_hac)C++20
100 / 100
125 ms28164 KiB
#include <bits/stdc++.h> using namespace std; #define int long long using pii = pair<int,int>; const int MOD = 1e9 + 7; // problem link: https://oj.uz/problem/view/BOI15_hac class MinQueue { private: stack<pair<int,int>> s1,s2; public: void push(int x){ int curr_min = x; if(!s1.empty()){ curr_min = min(curr_min, s1.top().second); } s1.push({x, curr_min}); } void pop(){ if(!s2.empty()){ s2.pop(); return; } while(!s1.empty()){ auto par = s1.top(); s1.pop(); int curr_min = par.first; if(!s2.empty()){ curr_min = min(curr_min, s2.top().second); } s2.push({par.first, curr_min}); } if(!s2.empty()) s2.pop(); } int query(){ if(s1.empty() && s2.empty()) return LLONG_MAX; if(s1.empty()) return s2.top().second; if(s2.empty()) return s1.top().second; return min(s1.top().second, s2.top().second); } }; signed main() { // ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int k = (n % 2 == 0) ? n/2 : n/2 + 1; vector<int> v(n); for(int i=0;i<n;i++){ cin >> v[i]; } vector<int> v2(2*n); for(int i=0;i<2*n;i++){ v2[i] = v[i % n]; } // copiei o circular para o vetor v2 de tamanho 2n para se livrar do circular // for(auto c : v2){ // cout << c << " "; // } vector<int> sums; int i=0, sum = 0; while(i < k){ sum += v2[i++]; } // printf("a soma dos k= %lld primeiros foi sum %lld \n", k, sum); sums.push_back(sum); while(sums.size() < n){ sum += v2[i]; sum -= v2[i-k]; sums.push_back(sum); // printf("aqui eu estou em i = %lld, eu coloquei o v[i] = %lld, tirei o v[i-k] = %lld, e a soma atual é %lld\n", i, v2[i], v2[i-k], sum); i++; } // então em sums está armazenada as n somas possíveis vector<int> sums2(2*n); for(int i=0;i<2*n;i++){ sums2[i] = sums[i % n]; } // cout << "\n"; // for(int i=0;i<2*n;i++){ // cout << sums2[i] << ' '; // } MinQueue q; for(int i=n-k+1;i<=n;i++){ q.push(sums2[i]); } int ans = q.query(); // cout << "\n" << ans << "\n"; for(int i=n+1;i<2*n;i++){ q.push(sums2[i]); q.pop(); ans = max(ans, q.query()); // printf("o resultado para a query atual foi %lld e o agora ans = %lld\n", q.query(), ans); } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...