Submission #1270631

#TimeUsernameProblemLanguageResultExecution timeMemory
1270631hypersphereHacker (BOI15_hac)C++20
100 / 100
230 ms200072 KiB
#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 = taken; i <= n - taken + 1; i++){ // Finding min of all subarrs length = taken, containing i. int r = i + taken - 1; int l = i; ll segment_min = get_min(sparse, l, r); //cout << i << ": " << segment_min << "\n"; all_mx = max(all_mx, segment_min); } 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...