#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
#define ll long long
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rand(ll l, ll r){
return uniform_int_distribution<ll>(l, r)(rng);
}
const ll mod = 998244353;
const ll INF = 1e18;
const int INT_INF = 2e9;
long long binpow(long long base, long long power, long long mod) {
if (base == 0) return 0;
if (base == 1) return 1;
if (power <= 0) return 1;
long long multiplier = (power % 2 == 0 ? 1 : base) % mod;
return (multiplier * binpow((base * base) % mod, power / 2, mod)) % mod;
}
ll gcd(ll a, ll b){
if(b == 0) return a;
return gcd(b, a % b);
}
ll add(ll a, ll b) {return a + b;}
ll sub(ll a, ll b) {return a - b;}
const int N = 5e5 + 1;
vector<int> adj[N];
int in[N];
int timer = -1;
void dfs(int node, int prev = -1){
in[node] = ++timer;
for(int v : adj[node]){
if(v == prev) continue;
dfs(v, node);
}
}
bool sort_by_in(int above, int below){
return in[above] < in[below];
}
const int LOGN = 19;
ll get_min(vector<vector<ll>>& sparse, int l, int r){
int len = r - l + 1;
int lower_log = (int)log2(len);
int cover_len = (1 << lower_log);
return min(sparse[r][lower_log], sparse[l + cover_len - 1][lower_log]);
}
void Run(){
int n; cin >> n;
n *= 2;
vector<int> arr(n + 1);
vector<ll> pref(n + 1);
for(int i = 1; i <= n/2; i++){
cin >> arr[i];
arr[i + n/2] = arr[i];
}
for(int i = 1; i <= n; i++){
pref[i] = (pref[i - 1] + arr[i]);
}
int taken = (n/2 + 1) / 2;
vector<ll> sum(n + 1);
for(int i = 1; i <= n; i++){
if(i <= taken) sum[i] = pref[i];
else sum[i] = pref[i] - pref[i - taken];
}
vector<vector<ll>> sparse(n + 1, vector<ll>(LOGN, 0)); // Stores min
for(int i = 1; i <= n; i++) {
sparse[i][0] = sum[i];
for(int lift = 1; lift < LOGN; lift++){
int half_length = (1 << (lift - 1));
sparse[i][lift] = min(sparse[i][lift - 1], sparse[max(i - half_length, 1)][lift - 1]);
}
}
ll all_mx = 0;
for(int i = 1; i <= n; i++){
// Finding min of all subarrs length = taken, containing i.
int r = min(n, i + taken - 1);
int l = max(i, taken);
all_mx = max(all_mx, get_min(sparse, l, r));
}
cout << all_mx << "\n";
}
int main(){
//freopen("CIRSSTR.INP", "r", stdin);
//freopen("CIRSSTR.OUT", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int test = 1;
//cin >> test;
// Measuring running time (breaks when manual input)
//auto time_start = clock();
while(test--) Run();
//auto time_end = clock();
//cerr << "Time taken: " << time_end - time_start << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |