結果
| 問題 |
No.703 ゴミ拾い Easy
|
| コンテスト | |
| ユーザー |
kcvlex
|
| 提出日時 | 2019-06-05 21:16:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 5,371 bytes |
| コンパイル時間 | 1,296 ms |
| コンパイル使用メモリ | 162,788 KB |
| 最終ジャッジ日時 | 2024-11-14 21:28:01 |
| 合計ジャッジ時間 | 2,972 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:46:1: error: ‘make_v’ function uses ‘auto’ type specifier without trailing return type
46 | auto make_v(T init, size_t s, Tail... tail) {
| ^~~~
main.cpp:46:1: note: deduced return type only available with ‘-std=c++14’ or ‘-std=gnu++14’
ソースコード
// #define DEBUGGING
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ALL(V) (V).begin(), (V).end()
#define ALLR(V) (V).rbegin(), (V).rend()
template <typename T> using V = vector<T>;
template <typename T> using VV = V<V<T>>;
template <typename T, typename U> using P = pair<T, U>;
using ll = int64_t;
using PLL = P<ll, ll>;
template <typename T> const T& var_min(const T &t) { return t; }
template <typename T> const T& var_max(const T &t) { return t; }
template <typename T, typename... Tail> const T& var_min(const T &t, const Tail&... tail) { return min(t, var_min(tail...)); }
template <typename T, typename... Tail> const T& var_max(const T &t, const Tail&... tail) { return max(t, var_max(tail...)); }
template <typename T, typename... Tail> void chmin(T &t, const Tail&... tail) { t = var_min(t, tail...); }
template <typename T, typename... Tail> void chmax(T &t, const Tail&... tail) { t = var_max(t, tail...); }
template <typename T> const T& clamp(const T &t, const T &low, const T &high) { return max(low, min(high, t)); }
template <typename T> void chclamp(T &t, const T &low, const T &high) { t = clamp(t, low, high); }
namespace init__ {
struct InitIO {
InitIO() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
cout << fixed << setprecision(30);
}
} init_io;
}
#ifdef DEBUGGING
#include "../debug.cpp"
#else
#define DEBUG(...) 0
#define DEBUG_SEPARATOR_LINE 0
#endif
template <typename T>
T make_v(T init) { return init; }
template <typename T, typename... Tail>
auto make_v(T init, size_t s, Tail... tail) {
#define rec make_v(init, tail...)
return V<decltype(rec)>(s, rec);
#undef rec
}
class LiChaoTree {
using Line = PLL;
V<ll> x_coors;
V<Line> nodes;
ll node_begin_idx;
function<ll(ll, ll)> comp; // maybe min or max
function<bool(ll, ll)> comp_bool;
Line invalid;
ll inf, identity_ele;
ll get_x_coor(ll xidx) { return xidx < x_coors.size() ? x_coors[xidx] : inf; }
void add_line_(Line line, ll node_idx, ll lidx, ll ridx) {
if(nodes.size() <= node_idx) return;
if(nodes[node_idx] == invalid) {
nodes[node_idx] = line;
return;
}
ll midx = (lidx + ridx) / 2;
ll lx = get_x_coor(lidx);
ll mx = get_x_coor(midx);
ll rx = get_x_coor(ridx);
if(lx == inf) return;
bool left_comp = comp_bool(calc_y(line, lx), calc_y(nodes[node_idx], lx));
bool mid_comp = comp_bool(calc_y(line, mx), calc_y(nodes[node_idx], mx));
bool right_comp = comp_bool(calc_y(line, rx), calc_y(nodes[node_idx], rx));
if(left_comp && right_comp) {
nodes[node_idx] = line;
return;
}
if(!left_comp && !right_comp) return;
if(mid_comp) {
swap(line, nodes[node_idx]);
left_comp = !left_comp;
right_comp = !right_comp;
}
if(left_comp) add_line_(line, 2 * node_idx + 1, lidx, midx);
else add_line_(line, 2 * node_idx + 2, midx, ridx);
}
public:
LiChaoTree(const V<ll> &x_coors, function<ll(ll, ll)> comp,
ll identity_ele, ll inf, Line invalid = Line(1e9, 1e9))
: comp(comp),
comp_bool([this](ll a, ll b) { return this->comp(a, b) == a; }),
identity_ele(identity_ele),
inf(inf),
invalid(invalid)
{
ll tmp = 1;
while(tmp < x_coors.size()) tmp *= 2;
node_begin_idx = tmp - 1;
this->x_coors.resize(tmp);
nodes.resize(2 * tmp - 1, invalid);
for(ll i = 0; i < x_coors.size(); i++) this->x_coors[i] = x_coors[i];
for(ll i = x_coors.size(); i < tmp; i++) this->x_coors[i] = inf;
}
ll calc_y(Line line, ll x) {
if(line == invalid) return identity_ele;
ll a, b;
tie(a, b) = line;
return a * x + b;
}
ll calc_y(ll idx, ll x) { return calc_y(nodes[idx], x); }
void add_line(Line line) { add_line_(line, 0, 0, x_coors.size()); }
void add_line(ll x, ll y) { add_line(Line(x, y)); }
ll query(ll xidx) {
ll node_idx = xidx + node_begin_idx;
ll x = x_coors[xidx];
ll ret = identity_ele;
while(true) {
if(nodes[node_idx] != invalid) {
ll y = calc_y(node_idx, x);
ret = comp(ret, y);
}
if(!node_idx) break;
node_idx = (node_idx - 1) / 2;
}
return ret;
}
};
inline void input(V<ll> &v) { for(ll &e : v) cin >> e; }
const ll inf = 1e12;
const PLL invalid = make_pair(inf, inf);
PLL create_line(ll x, ll y, ll val) {
if(x == inf || y == inf || val == inf) return invalid;
return make_pair(-2 * x, x * x + y * y + val);
}
int main() {
ll N;
cin >> N;
V<ll> A(N), X(N), Y(N);
input(A);
input(X);
input(Y);
X.push_back(inf);
Y.push_back(inf);
LiChaoTree lct(A, [](ll a, ll b) { return min(a, b); }, inf, inf, invalid);
lct.add_line(create_line(X[0], Y[0], 0));
ll ans = pow(X[0] - A[0], 2) + pow(Y[0], 2);
for(ll i = 0; i < N; i++) {
ll val = lct.query(i);
val += A[i] * A[i];
ans = val;
DEBUG(val);
lct.add_line(create_line(X[i + 1], Y[i + 1], val));
}
cout << ans << endl;
return 0;
}
kcvlex