Init
This commit is contained in:
78
ACMOJ-2058.cpp
Normal file
78
ACMOJ-2058.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int kMaxn = 1e5 + 10;
|
||||
const LL kInf = 1e18;
|
||||
LL f[kMaxn];
|
||||
int n, w[kMaxn];
|
||||
struct Data {
|
||||
int x, oid;
|
||||
LL y;
|
||||
} val[kMaxn], tmp[kMaxn];
|
||||
double Slope(int a, int b) {
|
||||
if (val[a].x == val[b].x) {
|
||||
return val[a].y < val[b].y ? kInf : -kInf;
|
||||
}
|
||||
return double(val[b].y - val[a].y) / double(val[b].x - val[a].x);
|
||||
}
|
||||
void CDQ(int L, int R) {
|
||||
if (L == R) {
|
||||
val[L].y = f[val[L].oid] + val[L].x * (LL)val[L].x;
|
||||
// printf("y(%d)=%d\n",L,val[L].y);
|
||||
return;
|
||||
}
|
||||
int M = (L + R) >> 1;
|
||||
for (int i = L, pl = L, pr = M + 1; i <= R; i++) {
|
||||
if (val[i].oid <= M) {
|
||||
tmp[pl++] = val[i];
|
||||
} else {
|
||||
tmp[pr++] = val[i];
|
||||
}
|
||||
}
|
||||
for (int i = L; i <= R; i++) val[i] = tmp[i];
|
||||
CDQ(L, M);
|
||||
int *Q = new int[R - L + 100](), QL = 1, QR = 0;
|
||||
for (int i = L; i <= M; i++) {
|
||||
while (QL < QR && Slope(Q[QR - 1], Q[QR]) > Slope(Q[QR], i))
|
||||
QR--;
|
||||
Q[++QR] = i;
|
||||
}
|
||||
for (int i = M + 1; i <= R; i++) {
|
||||
while (QL < QR && Slope(Q[QL], Q[QL + 1]) < 2 * val[i].x) QL++;
|
||||
int x = val[i].oid, y = val[Q[QL]].oid;
|
||||
f[x] = min(f[x], f[y] - w[x] +
|
||||
(val[i].x - val[Q[QL]].x) * (LL)(val[i].x - val[Q[QL]].x));
|
||||
}
|
||||
CDQ(M + 1, R);
|
||||
for (int i = L, pl = L, pr = M + 1; i <= R; i++) {
|
||||
if (pr > R || (pl <= M && val[pl].x < val[pr].x))
|
||||
tmp[i] = val[pl++];
|
||||
else
|
||||
tmp[i] = val[pr++];
|
||||
}
|
||||
for (int i = L; i <= R; i++) val[i] = tmp[i];
|
||||
delete[] Q;
|
||||
}
|
||||
int main() {
|
||||
#ifdef local
|
||||
freopen("pro.in", "r", stdin);
|
||||
#endif
|
||||
scanf("%d", &n);
|
||||
for (int i = 1; i <= n; i++) {
|
||||
scanf("%d", &val[i].x);
|
||||
val[i].oid = i;
|
||||
f[i] = kInf * 4;
|
||||
}
|
||||
f[1] = 0;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
scanf("%d", &w[i]);
|
||||
if (i >= 2) f[1] += w[i];
|
||||
}
|
||||
sort(val + 1, val + 1 + n,
|
||||
[](const Data &a, const Data &b) { return a.x < b.x; });
|
||||
CDQ(1, n);
|
||||
printf("%lld\n", f[n]);
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user