結果
問題 | No.2332 Make a Sequence |
ユーザー |
![]() |
提出日時 | 2023-05-28 15:25:09 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 241 ms / 2,000 ms |
コード長 | 4,126 bytes |
コンパイル時間 | 2,571 ms |
コンパイル使用メモリ | 220,220 KB |
最終ジャッジ日時 | 2025-02-13 13:13:55 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 61 |
ソースコード
#include<bits/stdc++.h>namespace {#pragma GCC diagnostic ignored "-Wunused-function"#include<atcoder/all>#pragma GCC diagnostic warning "-Wunused-function"using namespace std;using namespace atcoder;#define rep(i,n) for(int i = 0; i < (int)(n); i++)#define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--)#define all(x) begin(x), end(x)#define rall(x) rbegin(x), rend(x)template<class T> bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; }template<class T> bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; }using ll = long long;using P = pair<int,int>;using VI = vector<int>;using VVI = vector<VI>;using VL = vector<ll>;using VVL = vector<VL>;// https://ei1333.github.io/library/structure/convex-hull-trick/dynamic-li-chao-tree.hpp/*** @brief Dynamic-Li-Chao-Tree* @docs docs/dynamic-li-chao-tree.md*/template< typename T, T x_low, T x_high, T id >struct DynamicLiChaoTree {struct Line {T a, b;Line(T a, T b) : a(a), b(b) {}inline T get(T x) const { return a * x + b; }};struct Node {Line x;Node *l, *r;Node(const Line &x) : x{x}, l{nullptr}, r{nullptr} {}};Node *root;DynamicLiChaoTree() : root{nullptr} {}Node *add_line(Node *t, Line &x, const T &l, const T &r, const T &x_l, const T &x_r) {if(!t) return new Node(x);T t_l = t->x.get(l), t_r = t->x.get(r);if(t_l <= x_l && t_r <= x_r) {return t;} else if(t_l >= x_l && t_r >= x_r) {t->x = x;return t;} else {T m = (l + r) / 2;if(m == r) --m;T t_m = t->x.get(m), x_m = x.get(m);if(t_m > x_m) {swap(t->x, x);if(x_l >= t_l) t->l = add_line(t->l, x, l, m, t_l, t_m);else t->r = add_line(t->r, x, m + 1, r, t_m + x.a, t_r);} else {if(t_l >= x_l) t->l = add_line(t->l, x, l, m, x_l, x_m);else t->r = add_line(t->r, x, m + 1, r, x_m + x.a, x_r);}return t;}}void add_line(const T &a, const T &b) {Line x(a, b);root = add_line(root, x, x_low, x_high, x.get(x_low), x.get(x_high));}Node *add_segment(Node *t, Line &x, const T &a, const T &b, const T &l, const T &r, const T &x_l, const T &x_r) {if(r < a || b < l) return t;if(a <= l && r <= b) {Line y{x};return add_line(t, y, l, r, x_l, x_r);}if(t) {T t_l = t->x.get(l), t_r = t->x.get(r);if(t_l <= x_l && t_r <= x_r) return t;} else {t = new Node(Line(0, id));}T m = (l + r) / 2;if(m == r) --m;T x_m = x.get(m);t->l = add_segment(t->l, x, a, b, l, m, x_l, x_m);t->r = add_segment(t->r, x, a, b, m + 1, r, x_m + x.a, x_r);return t;}void add_segment(const T &l, const T &r, const T &a, const T &b) {Line x(a, b);root = add_segment(root, x, l, r - 1, x_low, x_high, x.get(x_low), x.get(x_high));}T query(const Node *t, const T &l, const T &r, const T &x) const {if(!t) return id;if(l == r) return t->x.get(x);T m = (l + r) / 2;if(m == r) --m;if(x <= m) return min(t->x.get(x), query(t->l, l, m, x));else return min(t->x.get(x), query(t->r, m + 1, r, x));}T query(const T &x) const {return query(root, x_low, x_high, x);}};} int main() {ios::sync_with_stdio(false);cin.tie(0);int n, m;cin >> n >> m;VI a(n), b(m), c(m);rep(i, n) cin >> a[i];rep(i, m) cin >> b[i];rep(i, m) cin >> c[i];VI ab(n + m + 1);rep(i, n) ab[i] = a[i];ab[n] = -1;rep(i, m) ab[n + 1 + i] = b[i];auto len = z_algorithm(ab);len.erase(len.begin(), len.begin() + n + 1);// rep(i, m) cout << len[i] << " \n"[i + 1 == m];constexpr long long INF = 1002003004005006007;DynamicLiChaoTree<ll, 0, 200010, INF> dp;dp.add_segment(0, 1, 0, 0);for(int i = 0; i <= m; i++) {ll v = dp.query(i);if (v == INF) {cout << -1 << '\n';break;}if (i == m) {cout << v << '\n';break;}// ci(x-i) + vdp.add_segment(i, i + len[i] + 1, c[i], v - (ll)i * c[i]);}exit(0);}