Submission #1205382

#TimeUsernameProblemLanguageResultExecution timeMemory
1205382hahahoang132Building Bridges (CEOI17_building)C++20
100 / 100
254 ms12164 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
const ll N = 1e6 + 6;
const ll inf = LLONG_MAX/4;
const ll mod = 1e9 + 7;


struct line
{
    ll t;
    ld x;
    ll a,b;
};

bool operator < (line t1, line t2)
{
    if(t1.t || t2.t) return t1.x < t2.x;
    else return t1.a > t2.a;
}

struct lc
{
    set<line> s;
    line prev(line a)
    {
        if(s.lower_bound(a) == s.begin()) return {-1,0,0,0};
        else return *(--s.lower_bound(a));
    }
    line next(line a)
    {
        if(s.upper_bound(a) == s.end())  return {-1,0,0,0};
        else return *(s.upper_bound(a));
    }
    void calx(line a)
    {
        line pa = prev(a);
        if(pa.t == -1) return;
        s.erase(a);
        a.x = giao(pa,a);
        s.insert(a);
    }
    ld giao(line a, line b)
    {
        return (ld)(a.b - b.b) / (b.a - a.a);
    }
    ll bad(line a)
    {
        line pa = prev(a);
        line na = next(a);
        if(pa.t == -1 || na.t == -1) return 0;
        return (giao(pa,a) >= giao(pa,na));
    }
    void add(ll a, ll b)
    {
        line it;
        if(s.lower_bound({0,0,a,b}) != s.end())
        {
            it = *s.lower_bound({0,0,a,b});
            if(it.a == a)
            {
                if(it.b <= b) return;
                s.erase(it);
            }
        }
        it = {0,0,a,b};
        s.insert(it);
        if(bad(it)) s.erase(it);
        else
        {
            while(true)
            {
                line pre = prev(it);
                if(pre.t == -1) break;
                if(bad(pre)) s.erase(pre);
                else break;
            }
            while(true)
            {
                line nex = next(it);
                if(nex.t == -1) break;
                if(bad(nex)) s.erase(nex);
                else break;
            }
            calx(it);
            if(next(it).t != -1) calx(next(it));
        }
    }
    ll get(ll x)
    {
        line ans = *(--s.upper_bound({1,(ld)x,0,0}));
        return ans.a * x + ans.b;
    }
};
lc f;
ll h[N],w[N],d[N];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n;
    cin >>n;
    ll i,j;
    for(i = 1;i <= n;i++)
    {
        cin >> h[i];
    }
    ll sum = 0;
    for(i  = 1;i <= n;i++)
    {
        cin >> w[i];
        sum += w[i];
    }
    d[1] = -w[1];
    for(i = 2;i <= n;i++)
    {
        f.add(-2 * h[i - 1], d[i - 1] + h[i - 1] * h[i - 1]);
        d[i] = f.get(h[i]) - w[i] + h[i] * h[i];
    }
    cout << sum + d[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...