結果

問題 No.705 ゴミ拾い Hard
ユーザー 👑 binap
提出日時 2024-04-10 09:15:57
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,766 bytes
コンパイル時間 4,517 ms
コンパイル使用メモリ 257,228 KB
最終ジャッジ日時 2025-02-20 23:40:16
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3 WA * 1
other AC * 12 WA * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include<bits/stdc++.h>
#include<atcoder/all>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
using namespace atcoder;
typedef long long ll;
typedef vector<int> vi;
typedef vector<long long> vl;
typedef vector<vector<int>> vvi;
typedef vector<vector<long long>> vvl;
typedef long double ld;
typedef pair<int, int> P;
ostream& operator<<(ostream& os, const modint& a) {os << a.val(); return os;}
template <int m> ostream& operator<<(ostream& os, const static_modint<m>& a) {os << a.val(); return os;}
template <int m> ostream& operator<<(ostream& os, const dynamic_modint<m>& a) {os << a.val(); return os;}
template<typename T> istream& operator>>(istream& is, vector<T>& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;}
template<typename U, typename T> ostream& operator<<(ostream& os, const pair<U, T>& p){os << p.first << ' ' << p.second; return os;}
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); return
    os;}
template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : "");
    return os;}
template<typename T> void chmin(T& a, T b){a = min(a, b);}
template<typename T> void chmax(T& a, T b){a = max(a, b);}
// thanks for Luzhiled's memo
// https://ei1333.github.io/luzhiled/snippets/dp/monotone-minima.html
template<typename T, typename Compare = less<T>>
pair<vector<T>, vector<int>> monotone_minima(int H, int W, const function<T(int, int)> &f, const Compare &comp = Compare()) {
vector<int> idx(H);
vector<T> res(H);
function<void(int, int, int, int)> dfs = [&](int top, int bottom, int left, int right) {
if(top > bottom) return;
int line = (top + bottom) / 2;
T ma = 0;
int mi = -1;
for(int i = left; i <= right; i++) {
T cst = f(line, i);
if(mi == -1 || comp(cst, ma)) {
ma = cst;
mi = i;
}
}
idx[line] = mi;
res[line] = ma;
dfs(top, line - 1, left, mi);
dfs(line + 1, bottom, mi, right);
};
dfs(0, H - 1, 0, W - 1);
return make_pair(res, idx);
}
template<typename T, typename Compare = greater<T>>
pair<vector<T>, vector<int>> monotone_maxima(int H, int W, const function<T(int, int)> &f, const Compare &comp = Compare()) {
return monotone_minima(H, W, f, comp);
}
const long long INF = 2002002002002002002;
// A must be monotone
template<typename T>
vector<T> max_plus_convolution(vector<T> A, vector<T> B){
function<long long(int, int)> f = [&](int i, int j){
if(i - j < 0 or i - j >= int(A.size())) return -INF;
return A[i - j] + B[j];
};
auto [idx, dp] = monotone_maxima(B.size() + A.size() - 1, B.size(), f);
return dp;
}
int main(){
int n;
cin >> n;
vector<long long> a(n);
vector<long long> x(n);
vector<long long> y(n);
cin >> a;
cin >> x;
cin >> y;
auto triple = [&](long long val){
val = abs(val);
return val * val * val;
};
auto dist = [&](int i, int j){
assert(j >= i);
return triple(a[j] - x[i]) + triple(y[i]);
};
auto solve = [&](int l, int r, auto solve) -> vector<long long>{
if(r == l + 1){
return vector<long long>{0LL, dist(l, l)};
}
int mid = (l + r) / 2;
auto L = solve(l, mid, solve);
auto R = solve(mid, r, solve);
vector<long long> res((r - l) + 1, INF);
rep(i, int(L.size())) chmin(res[i], L[i]);
rep(i, int(R.size())) chmin(res[(mid - l) + i], L[mid - l] + R[i]);
function<long long(int, int)> f = [&](int i, int j){
return L[j] + dist(l + j, (mid + i) - 1);
};
auto [E, tmp] = monotone_minima((r - mid + 1), (mid - l), f);
assert(E.size() == R.size());
rep(i, int(E.size())) chmin(res[(mid - l) + i], E[i]);
return res;
};
auto E = solve(0, n, solve);
cout << E[n] << "\n";
// cout << E;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0