Submission #779357

#TimeUsernameProblemLanguageResultExecution timeMemory
779357danikoynovBuilding Bridges (CEOI17_building)C++14
30 / 100
3056 ms97192 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const ll inf = 1e18; const int maxn = 1e5 + 10; struct line { ll k, m; bool fresh; line(bool _fresh = false, ll _k = 0, ll _m = 0) { fresh = _fresh; k = _k; m = _m; } ll get_value(ll x) { return k * x + m; } }; const int maxc = 1e6 + 10; line tree[4 * maxc]; void add_line(int root, ll left, ll right, line cur) { if (tree[root].fresh) { tree[root] = cur; return; } ll mid = (left + right) / 2; if (tree[root].get_value(mid) > cur.get_value(mid)) swap(tree[root], cur); if (tree[root].get_value(left) > cur.get_value(left)) add_line(root * 2, left, mid, cur); if (tree[root].get_value(right) > cur.get_value(right)) add_line(root * 2 + 1, mid + 1, right, cur); } ll query(int root, ll left, ll right, ll x) { if (tree[root].fresh) return inf; if (left == right) return tree[root].get_value(x); ll mid = (left + right) / 2, val; if (x <= mid) val = query(root * 2, left, mid, x); else val = query(root * 2 + 1, mid + 1, right, x); return min(val, tree[root].get_value(x)); } int n; ll h[maxn], w[maxn], pref[maxn], dp[maxn]; void solve() { cin >> n; for (int i = 1; i <= n; i ++) cin >> h[i]; for (int i = 1; i <= n; i ++) cin >> w[i], pref[i] = pref[i - 1] + w[i]; dp[1] = 0; for (int i = 2; i <= n; i ++) { dp[i] = inf; for (int j = 1; j < i; j ++) { ///dp[i] = min(dp[i], dp[j] + pref[i - 1] - pref[j] + (h[i] - h[j]) * (h[i] - h[j])); dp[i] = min(dp[i], dp[j] + pref[i - 1] - pref[j] + h[i] * h[i] + h[j] * h[j] - 2 * h[i] * h[j]); } } cout << dp[n] << endl; } int main() { solve(); return 0; } /** 6 3 8 7 1 6 6 0 -1 9 1 2 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...