結果
問題 | No.703 ゴミ拾い Easy |
ユーザー |
![]() |
提出日時 | 2018-06-15 23:04:26 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 107 ms / 1,500 ms |
コード長 | 2,978 bytes |
コンパイル時間 | 866 ms |
コンパイル使用メモリ | 95,284 KB |
実行使用メモリ | 12,696 KB |
最終ジャッジ日時 | 2025-01-02 13:52:17 |
合計ジャッジ時間 | 5,083 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 46 |
ソースコード
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <string>#include <iomanip>#include <algorithm>#include <cmath>#include <stdio.h>#include <algorithm>#include <functional>#include <utility>using namespace std;#define int long longint MOD = 1000000007;template<typename T>class ConvecHullTrick {private:// 直線群(配列)std::vector<std::pair<T, T>> lines;// 最小値(最大値)を求めるxが単調であるかbool isMonotonicX;// 最小/最大を判断する関数std::function<bool(T l, T r)> comp;public:// コンストラクタ ( クエリが単調であった場合はflag = trueとする )ConvecHullTrick(bool flagX = false, std::function<bool(T l, T r)> compFunc = [](T l, T r) {return l >= r; }):isMonotonicX(flagX), comp(compFunc) {//lines.emplace_back(0, 0);};// 直線l1, l2, l3のうちl2が不必要であるかどうかbool check(std::pair<T, T> l1, std::pair<T, T> l2, std::pair<T, T> l3) {if (l1 < l3) std::swap(l1, l3);return (l3.second - l2.second) * (l2.first - l1.first) >= (l2.second - l1.second) * (l3.first - l2.first);}// 直線y=ax+bを追加するvoid add(T a, T b) {std::pair<T, T> line(a, b);while (lines.size() >= 2 && check(*(lines.end() - 2), lines.back(), line))lines.pop_back();lines.emplace_back(line);}// i番目の直線f_i(x)に対するxの時の値を返すT f(int i, T x) {return lines[i].first * x + lines[i].second;}// i番目の直線f_i(x)に対するxの時の値を返すT f(std::pair<T, T> line, T x) {return line.first * x + line.second;}// 直線群の中でxの時に最小(最大)となる値を返すT get(T x) {// 最小値(最大値)クエリにおけるxが単調if (isMonotonicX) {static int head = 0;while (lines.size() - head >= 2 && comp(f(head, x), f(head + 1, x)))++head;return f(head, x);}else {int low = -1, high = lines.size() - 1;while (high - low > 1) {int mid = (high + low) / 2;(comp(f(mid, x), f(mid + 1, x)) ? low : high) = mid;}return f(high, x);}}};signed main() {cin.tie(0);ios::sync_with_stdio(false);int N;cin >> N;vector<int> A(N);vector<int> X(N);vector<int> Y(N);vector<int> dp(N + 1, 0);int res = 0;for (int i = 0; i < N; i++) {cin >> A[i];A[i]++;}for (int i = 0; i < N; i++) {cin >> X[i];X[i]++;}for (int i = 0; i < N; i++) {cin >> Y[i];//Y[i]++;}ConvecHullTrick<int> cht(false);//cht.add()cht.add(-2 * X[0], Y[0] * Y[0] + X[0] * X[0] + dp[0]);cerr << -2 * X[0] << endl;cerr << Y[0] * Y[0] + X[0] * X[0] + dp[0] << endl;///cht.get()cerr << cht.get(1) << endl;for (int i = 1; i <= N; i++) {int a = cht.get(A[i - 1]);dp[i] = a + A[i - 1] * A[i - 1];if (i < N)cht.add(-2 * X[i], Y[i] * Y[i] + X[i] * X[i] + dp[i]);}/*for (int i = 0; i <= N; i++) {cerr << dp[i] << " ";}cerr << endl;*/cout << dp[N] << endl;}