WA 在 点 14 和 19 上,答案偏大,有可能是精度的问题,但是查不出来。。
#include <bits/stdc++.h>
int n, m, A, B, C;
struct poi{
int x, y, id;
};
std::vector<poi>c[1005];
struct node{
int l, r;
std::vector<poi>v;
inline double slope(poi a, poi b){
if(a.x == b.x) {
if(a.y >= b.y) return (double)2e9;
else return (double)-2e9;
}
return (double)(a.y - b.y) / (double)(a.x - b.x);
}
inline poi pop(int k){
while(l < r && slope(v[l + 1], v[l]) < (double) k) ++l;
if(l > r) return (poi){-1, -1, -1};
return v[l];
}
inline void push(poi u){
while(l < r && slope(v[r], v[r - 1]) > slope(u, v[r])) --r;
++r;
v.push_back(u);
return ;
}
}d[100005];
int dp[200005], vis[200005];
struct route{
int u, v, p, q;
}r[200005];
inline bool cmp(route a, route b){
return a.p < b.p;
}
signed main(){
//freopen("route19.in", "r", stdin);
scanf("%d%d%d%d%d", &n, &m, &A, &B, &C);
for(int i = 1; i <= n; ++i) d[i].l = 0, d[i].r = -1;
for(int i = 1; i <= m; ++i)
scanf("%d%d%d%d", &r[i].u, &r[i].v, &r[i].p, &r[i].q);
std::sort(r + 1, r + m + 1, cmp);
poi o;
o.x = 0, o.y = 0;
r[0].p = 0;
d[1].push(o);
for(int i = 1; i <= m; ++i){
for(int j = r[i - 1].p + 1; j <= r[i].p; ++j){
for(int k = 0; k < c[j].size(); ++k){
d[c[j][k].id].push(c[j][k]);
}
}
poi s = d[r[i].u].pop(2 * A * r[i].p);
if(s.id == -1) {
vis[i] = 1;
continue;
}
dp[i] = s.y - 2 * A * r[i].p * s.x +
A * r[i].p * r[i].p + B * r[i].p + C;
c[r[i].q].push_back((poi){r[i].q, dp[i] + A * r[i].q * r[i].q - B * r[i].q, r[i].v});
}
int Ans = -1 + (1 << 30) + (1 << 30);
for(int i = 1; i <= m; ++i)
if(!vis[i] && r[i].v == n)
Ans = std::min(Ans, dp[i] + r[i].q);
printf("%d\n", Ans);
return 0;
}