Submission #1358142

#TimeUsernameProblemLanguageResultExecution timeMemory
1358142goulthenBuilding Bridges (CEOI17_building)C++20
0 / 100
99 ms2772 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define fi first
#define se second

const int MAXN = 1e5+10;
const int INF = 1e9+67;
int h[MAXN],w[MAXN], dp[MAXN];

set<pii> cht;

int query(int x) {
    int i = prev(cht.upper_bound({x,INF}))->se;
    return dp[i] -2*h[i]*x;
}

void add(int i) {
    // dp[i] + -2*h[i]*x

    auto ts = [&](int lo, int hi) {
        while (lo<=hi) {
            int mid = (hi-lo)/2 + lo;
            int x = -2*mid*h[i] + dp[i];
            int d1 = x-query(mid), d2 = x-query(mid+1)-2*h[i];
            if(d1 <= 0) return mid;

            if(d2<d1) {
                lo = mid+1;
            } else {
                hi = mid-1;
            }
        }
        return INF;
    };

    auto bs = [&](int lo, int hi, int dir = 1) {
        int res=hi;
        while (lo<=hi) {
            int mid = (hi-lo)/2 + lo;

            if(-2*h[i]*mid + dp[i] <= query(mid)) {
                if(dir==1) hi = mid-1;
                else lo = mid+1;
                res = mid;
            } else {
                if(dir==1) lo = mid+1;
                else hi = mid-1;
            }
        }
        return res;
    };
    int bp = ts(-INF,INF);
    if(bp==INF) return;

    int pi = bs(-INF,bp);
    int pj = bs(bp,INF,-1);

    int lst = -1;
    auto pt = cht.lower_bound({pi,0});
    while (pt!=cht.end() && pt->se <= pj) {
        lst = pt->se;
        cht.erase(pt);
        pt = cht.lower_bound({pi,0});
    }
    cht.insert({pi,i});
    if(lst != -1) cht.insert({pj+1,lst});
}

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
    int n; cin >> n;
    rep(i,1,n) cin >> h[i];
    rep(i,1,n) cin >> w[i];

    dp[1] = -w[1]+2*h[1]*h[1];
    cht.insert((pii){-INF, 1});
    rep(i,2,n) {
        dp[i] = query(h[i]) -w[i]+2*h[i]*h[i];
        add(i);
    }
    int sw = 0;
    rep(i,1,n) sw+=w[i];


    cout << dp[n] - h[1]*h[1] - h[n]*h[n] + sw;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...