답안 #1078748

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1078748 2024-08-28T05:43:15 Z vjudge1 Building Bridges (CEOI17_building) C++17
100 / 100
52 ms 36692 KB
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct {
    struct line{
        int K;
        int B;
        line(int k,int b){
            K=k,B=b;
        }
        line(){
            K=0;
            B=1e18;
        }
        inline int operator()(int x){
            return K*x+B;
        }
    } T[1<<21];
    void update(int i,int l,int r,line s){
        if(T[i].B==1e18) return void(T[i]=s);
        if(l==r-1){
            if(s(l)<T[i](l))
                swap(s,T[i]);
            return;
        }
        if(s.K<T[i].K)
            swap(s,T[i]);
        int mid=l+r>>1;
        if(s(mid) < T[i](mid))
            swap(s,T[i]),update(i*2+1,mid,r,s);
        else update(i*2,l,mid,s);
    }
    int query(int i,int l,int r,int p){
        if(T[i].B==1e18)
            return 1e18;
        if(l==r-1)
            return T[i](p);
        if(p<l+r>>1)
            return min(T[i](p),query(i*2,l,l+r>>1,p));
        else return min(T[i](p),query(i*2+1,l+r>>1,r,p));
    }
    void add_line(int k,int b){
        update(1,-1,1e6+1,line(k,b));
    }
    int calc_best(int pos){
        return query(1,-1,1e6+1,pos);
    }
} lichao;
int h[100100],w[100100],dp[100100];
void update_dp(int i){
    lichao.add_line(-2*h[i],h[i]*h[i]-w[i]+dp[i]);
}
signed main(){
    cin.tie(0)->sync_with_stdio(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];
    for(int i=2;i<=n;i++){
        update_dp(i-1);
        w[i]+=w[i-1];
        dp[i]=lichao.calc_best(h[i])+h[i]*h[i]+w[i-1];
    }
    cout<<dp[n]<<'\n';
}

Compilation message

building.cpp: In member function 'void<unnamed struct>::update(long long int, long long int, long long int, <unnamed struct>::line)':
building.cpp:28:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   28 |         int mid=l+r>>1;
      |                 ~^~
building.cpp: In member function 'long long int<unnamed struct>::query(long long int, long long int, long long int, long long int)':
building.cpp:38:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |         if(p<l+r>>1)
      |              ~^~
building.cpp:39:45: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |             return min(T[i](p),query(i*2,l,l+r>>1,p));
      |                                            ~^~
building.cpp:40:46: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   40 |         else return min(T[i](p),query(i*2+1,l+r>>1,r,p));
      |                                             ~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 33112 KB Output is correct
2 Correct 12 ms 33116 KB Output is correct
3 Correct 14 ms 33276 KB Output is correct
4 Correct 16 ms 33116 KB Output is correct
5 Correct 13 ms 33232 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 36184 KB Output is correct
2 Correct 48 ms 36440 KB Output is correct
3 Correct 47 ms 36500 KB Output is correct
4 Correct 42 ms 36404 KB Output is correct
5 Correct 33 ms 36432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 33112 KB Output is correct
2 Correct 12 ms 33116 KB Output is correct
3 Correct 14 ms 33276 KB Output is correct
4 Correct 16 ms 33116 KB Output is correct
5 Correct 13 ms 33232 KB Output is correct
6 Correct 48 ms 36184 KB Output is correct
7 Correct 48 ms 36440 KB Output is correct
8 Correct 47 ms 36500 KB Output is correct
9 Correct 42 ms 36404 KB Output is correct
10 Correct 33 ms 36432 KB Output is correct
11 Correct 52 ms 36624 KB Output is correct
12 Correct 49 ms 36624 KB Output is correct
13 Correct 44 ms 36692 KB Output is correct
14 Correct 51 ms 36552 KB Output is correct
15 Correct 38 ms 36436 KB Output is correct
16 Correct 36 ms 36436 KB Output is correct
17 Correct 32 ms 36692 KB Output is correct
18 Correct 33 ms 36692 KB Output is correct