제출 #479262

#제출 시각아이디문제언어결과실행 시간메모리
479262RainbowbunnyBuilding Bridges (CEOI17_building)C++17
100 / 100
106 ms65252 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100005;
const int MAXV = 1000005;
const long long INF = 1e18;

struct Line
{
    long long k, b;
    Line(long long k = 0, long long b = INF) : k(k), b(b) {}
    long long eval(long long x)
    {
        return k * x + b;
    }
};

int n;
long long ans, h[MAXN], w[MAXN], dp[MAXN];

Line IT[4 * MAXV];

void Update(int node, int l, int r, Line L)
{
    int mid = (l + r) >> 1;
    bool lef = IT[node].eval(l) > L.eval(l);
    bool m = IT[node].eval(mid) > L.eval(mid);
    if(m)
    {
        swap(L, IT[node]);
    }
    if(l == r)
    {
        return;
    }
    if(lef != m)
    {
        Update(node << 1, l, mid, L);
    }
    else
    {
        Update(node << 1 | 1, mid + 1, r, L);
    }
}

long long Get(int node, int l, int r, int i)
{
    int mid = (l + r) >> 1;
    if(l == r)
    {
        return IT[node].eval(i);
    }
    if(i <= mid)
    {
        return min(IT[node].eval(i), Get(node << 1, l, mid, i));
    } 
    else
    {
        return min(IT[node].eval(i), Get(node << 1 | 1, mid + 1, r, i));
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> h[i];
    }
    for(int i = 1; i <= n; i++)
    {
        cin >> w[i];
        w[i] += w[i - 1];
    }
    for(int i = 1; i <= n; i++)
    {
        if(i != 1)
        {
            dp[i] = Get(1, 0, MAXV, h[i]) + h[i] * h[i] + w[i - 1];
        }
        else
        {
            dp[i] = 0;
        }
        Line tmp(-2 * h[i], h[i] * h[i] - w[i] + dp[i]);
        Update(1, 0, MAXV, tmp);
    }
    cout << dp[n] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...