COFO::1623C Balanced Stone Heaps

Problem

Point

Design

Complexity

Code

#include<bits/stdc++.h>
#define all(a) a.begin(), a.end()
#define sz(a) (int) a.size()
#define rep(i, a, b) for(int i=(a); i <(b); i++)
#define r_rep(i, a, b) for(int i=(a); i >(b); i--)
typedef long long ll;
using namespace std;
const int MAXN = 2 * 1e5 + 9;

int n;
ll b[MAXN];
ll a[MAXN]; // copied
bool possible(ll mid) {
    rep(i, 0, n) a[i] = b[i];

    r_rep(i, n-1, 1) {
        if(a[i] < mid) return false;
        ll d = min(b[i], a[i] - mid) / 3;
        a[i] -= d * 3, a[i-1] += d, a[i-2] += d * 2;
    }
    return a[0] >= mid && a[1] >= mid;
}
void bs(ll st, ll en) {
    ll ans = -1;
    while(st <= en) {
        ll mid = (st + en) >> 1;
        if (possible(mid)) {
            ans = max(ans, mid);
            st = mid + 1;
        } else en = mid - 1;
    }
    cout << ans << '\n';
}
void solve() {
    cin >> n;
    rep(i, 0, n) cin >> b[i];
    ll h = *max_element(b, b + n);
    
    bs(1, h);
}
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int tc; cin >> tc;
    while(tc--)
        solve();
    return 0;
}