답안 #426786

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
426786 2021-06-14T09:49:32 Z oleh1421 Building Bridges (CEOI17_building) C++17
0 / 100
3000 ms 3664 KB
//#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> line;

const int N=1000010;
const ll mod=1000000007;
const ll inf=1e15;
ll h[N],w[N];
ll dp[N];
ll a[N],b[N];
line t[N];
ll f(line cur,ll x){
    return cur.first*x+cur.second;
}
int TOT=1;
int L[N],R[N];
void upd(int v,int l,int r,line cur){
//    cout<<v<<" "<<l<<" "<<r<<endl;

    ll mid=(l+r)/2;
    if (f(t[v],mid)>f(cur,mid)) swap(t[v],cur);
    if (cur.second==inf || l==r) return;
    if (f(t[v],l)>f(cur,l)){
        if (!L[v]) L[v]=++TOT;
        upd(L[v],l,mid,cur);
    } else {
        if (!R[v]) R[v]=++TOT;
        upd(R[v],mid+1,r,cur);
    }
}
ll get(int v,int l,int r,int pos){
//    cout<<v<<" "<<l<<" "<<r<<endl;
    if (l==r) return f(t[v],pos);
    if (!v) return inf;
    int mid=(l+r)/2;
    if (pos<=mid) return min(f(t[v],pos),get(L[v],l,mid,pos));
    else return min(f(t[v],pos),get(R[v],mid+1,r,pos));
}
int main(){
    t[0]={1e9,inf};
    t[1]={1e9,inf};
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;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];
    dp[1]=0;
    a[1]=h[1]*h[1]-w[1]+dp[1];
    b[1]=-2*h[1];
    upd(1,0,1e9,{b[1],a[1]});
//    cout<<"Line "<<b[1]<<" "<<a[1]<<endl;
    for (int i=2;i<=n;i++){
        dp[i]=min(inf,get(1,0,1e9,h[i]));
        for (int j=1;j<i;j++){
            dp[i]=min(dp[i],a[j]+b[j]*h[i]);
        }
        dp[i]+=h[i]*h[i]+w[i-1];
//        cout<<i<<" "<<dp[i]<<endl;
        a[i]=h[i]*h[i]+dp[i]-w[i];
        b[i]=-2*h[i];
        upd(1,0,1e9,{b[i],a[i]});
//        cout<<"Line "<<b[i]<<" "<<a[i]<<endl;
    }
    cout<<dp[n]<<endl;
    return 0;
}
/**
6
3 8 7 1 6 6
0 -1 9 1 2 0
**/
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 2 ms 332 KB Output is correct
5 Incorrect 3 ms 332 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3035 ms 3664 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 2 ms 332 KB Output is correct
5 Incorrect 3 ms 332 KB Output isn't correct