Submission #541115

#TimeUsernameProblemLanguageResultExecution timeMemory
541115Vladth11Building Bridges (CEOI17_building)C++14
100 / 100
74 ms66444 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "

using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;

const ll NMAX = 1000001;
const ll VMAX = 1000001;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 1000000;
const ll nr_of_bits = 16;

ll h[NMAX], w[NMAX];
ll dp[NMAX];

struct functie{
    ll a, b;
    ll f(ll x){
        if(b == INF) /// Asta e notatia ca functia nu exista
            return INF;
        return a + b * x;
    }
}lichao[NMAX * 4];

void baga(int node, int st, int dr, functie x){
    if(st == dr){
        if(lichao[node].f(st) > x.f(st))
            swap(lichao[node], x);
        return;
    }
    int mid = (st + dr) / 2;
    ll ls = lichao[node].f(st);
    ll lm = lichao[node].f(mid);
    ll xs = x.f(st);
    ll xm = x.f(mid);
    if(xm < lm){
        swap(lichao[node], x);
        if(xs > ls)
            baga(node * 2, st, mid, x);
        else
            baga(node * 2 + 1, mid + 1, dr, x);
    }else{
        if(xs > ls)
            baga(node * 2 + 1, mid + 1, dr, x);
        else
            baga(node * 2, st, mid, x);
    }
}

ll query(int node, int st, int dr, int poz){
    if(st == dr){
        return lichao[node].f(poz);
    }
    int mid = (st + dr) / 2;
    ll minim = lichao[node].f(poz);
    if(poz <= mid){
        minim = min(minim, query(node * 2, st, mid, poz));
    }else{
        minim = min(minim, query(node * 2 + 1, mid + 1, dr, poz));
    }
    return minim;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, i;
    cin >> n;
    for(i = 1; i < 4 * NMAX; i++)
        lichao[i].b = INF;
    for(i = 1; i <= n; i++){
        cin >> h[i];
    }
    for(i = 1; i <= n; i++){
        cin >> w[i];
        w[i] += w[i - 1];
    }
    for(i = 1; i <= n; i++){
        ll sum = h[i] * h[i] + w[i - 1];
        ll minim = query(1, 0, NMAX, h[i]);
        if(i == 1){
            dp[i] = 0;
        }else{
            dp[i] = sum + minim;
        }
        baga(1, 0, NMAX, {h[i] * h[i] - w[i] + dp[i], -2 * h[i]});
    }
    cout << dp[n];
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...