Submission #1277645

#TimeUsernameProblemLanguageResultExecution timeMemory
1277645harryleeeBuilding Bridges (CEOI17_building)C++20
100 / 100
59 ms65356 KiB
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5; int n; long long w[maxn + 1], h[maxn + 1]; long long dp[maxn + 1]; struct line{ long long a, b; inline line(long long _a = 0, long long _b = 0){ a = _a; b = _b; } inline long long calc(int x){ return a * x + b; } }; struct LICHAO_TREE{ vector<line> st; int sz; inline LICHAO_TREE(){ sz = 1e6; st.resize(4 * sz + 4, line(0, 1e18)); } inline void update(int ind, int l, int r, line cur){ if (l == r){ if (cur.calc(l) < st[ind].calc(l)) st[ind] = cur; return; } int mid = (l + r) >> 1; if (st[ind].calc(mid) > cur.calc(mid)) swap(st[ind], cur); if (cur.calc(l) < st[ind].calc(l)) update(ind << 1, l, mid, cur); if (cur.calc(r) < st[ind].calc(r)) update(ind << 1 | 1, mid + 1, r, cur); return; } inline long long get(int ind, int l, int r, int pos){ long long res = st[ind].calc(pos); if (l == r) return res; int mid = (l + r) >> 1; if (pos <= mid) return min(res, get(ind << 1, l, mid, pos)); else return min(res, get(ind << 1 | 1, mid + 1, r, pos)); } } lichao; int main(){ ios_base::sync_with_stdio(0); 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]; } lichao.update(1, 1, 1e6, {-2 * h[1], dp[1] - w[1] + h[1] * h[1]}); for (int i = 2; i <= n; ++i){ dp[i] = lichao.get(1, 1, 1e6, h[i]) + h[i] * h[i] + w[i - 1]; lichao.update(1, 1, 1e6, {-2 * h[i], dp[i] - w[i] + h[i] * h[i]}); } cout << dp[n]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...