// #pragma GCC optimize(3, "Ofast", "inline", "unroll-loops")
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1000010;
const int inf = 1e18;
const int mod = 998244353;
int ix[N], a[N];
double x[N], r[N], v[N], f[N];
struct Line
{
double k, b;
} lne[N];
inline int calc(int id, int pos)
{
if (!id)
return 1e9;
return lne[id].k * x[pos] + lne[id].b;
}
namespace My_Hyper_Sgt
{
int tree[N << 2];
// 将编号为 id 的线段插入我超线段树
void ins(int l, int r, int rt, int id)
{
if (l == r)
{
if (calc(id, l) < calc(tree[rt], l))
tree[rt] = id;
return;
}
int mid = l + r >> 1;
if (calc(id, mid) < calc(tree[rt], mid))
swap(id, tree[rt]);
if (calc(id, l) < calc(tree[rt], l))
ins(l, mid, rt << 1, id);
if (calc(id, r) < calc(tree[rt], r))
ins(mid + 1, r, rt << 1 | 1, id);
}
// 询问所有直线中 x=v 时 y 取值最小是多少
double query(int l, int r, int rt, int val)
{
if (l == r)
return calc(tree[rt], val);
double now = calc(tree[rt], val), mid = l + r >> 1;
if (val <= mid)
return min(now, query(l, mid, rt << 1, val));
return min(now, query(mid + 1, r, rt << 1 | 1, val));
}
} using namespace My_Hyper_Sgt;
signed main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> x[i] >> r[i] >> v[i];
for (int i = 1; i <= n; ++i)
a[i] = x[i];
sort(a + 1, a + n + 1);
int idx = unique(a + 1, a + n + 1) - a - 1;
for (int i = 1; i <= n; ++i)
ix[i] = lower_bound(a + 1, a + idx + 1, x[i]) - a, f[i] = 1e18;
f[1] = 0;
int tot = 0;
double res = 1e18;
if (r[1] + ix[1] >= m)
res = r[1];
lne[tot = 1] = {sqrt(r[1]) / (2 * r[1]), f[1] + v[1] - 1. * a[ix[1]] * (sqrt(r[1]) / (2 * r[1]))};
ins(1, idx, 1, tot);
for (int i = 2; i <= n; ++i)
{
f[i] = query(1, idx, 1, ix[i]);
lne[++tot] = {sqrt(r[i]) / (2 * r[i]), f[i] + v[i] - 1. * a[ix[i]] * (sqrt(r[i]) / (2 * r[i]))};
if (a[ix[i]] + r[i] >= m)
res = min(res, f[i] + v[i]);
ins(1, idx, 1, tot);
}
printf("%.3lf\n", res);
return 0;
}
对着题解改了很久都过不去下面的数据:
21 199
30 5 456
33 13 1010
46 12 989
47 11 248
75 9 723
75 8 796
96 6 153
98 16 857
103 18 644
118 14 514
123 21 151
125 15 438
138 7 555
146 2 203
152 1 433
156 10 148
168 17 968
178 4 815
179 19 691
185 20 661
194 3 52
正确答案应为 1151.659,我输出 1150.000,可能是哪个地方浮点被转成整数了但是调不出来了/dk