제출 #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...