| 比赛 |
寒假集训2 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
回家路线 |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
1.942 s |
| 代码语言 |
C++ |
内存使用 |
72.18 MiB |
| 提交时间 |
2026-02-25 11:03:56 |
显示代码纯文本
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define ll long long
const int MAXN = 2 * 1e5 + 5;
int n, m;
ll A, B, C;
ll u[MAXN], v[MAXN], q[MAXN], p[MAXN], dp[MAXN];
int id1[MAXN], id2[MAXN];
deque<int> Q[MAXN >> 1];
double X(int x){
return q[x];
}
double Y(int x){
return dp[x] + A * q[x] * q[x] - B * q[x];
}
double slope(int a, int b){
if(X(a) == X(b)) return Y(a) >= Y(b) ? 1e18 : -1e18;
return (Y(a) - Y(b)) / (X(a) - X(b));
}
bool cmp1(int a, int b){
return p[a] < p[b];
}
bool cmp2(int a, int b){
return q[a] < q[b];
}
int main(){
freopen("rout.in", "r", stdin);
freopen("rout.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n >> m >> A >> B >> C;
for(int i = 1;i <= m;i ++){
cin >> u[i] >> v[i] >> p[i] >> q[i];
id1[i] = id2[i] = i;
dp[i] = 1e18;
}
sort(id1 + 1, id1 + m + 1, cmp1);
sort(id2 + 1, id2 + m + 1, cmp2);
dp[0] = q[0] = 0; v[0] = 1;
Q[1].push_back(0);
int nxt = 1;
for(int k = 1;k <= m;k ++){
int i = id1[k];
while(nxt <= m && q[id2[nxt]] <= p[i]){
int j = id2[nxt ++];
// cout << j << '\n';
if(dp[j] == 1e18) continue;
int st = v[j];
while(Q[st].size() > 1 && slope(j, Q[st][Q[st].size() - 2]) <= slope(Q[st][Q[st].size() - 2], Q[st][Q[st].size() - 1])){
Q[st].pop_back();
}
Q[st].push_back(j);
}
int st = u[i];
if(Q[st].empty()) continue;
while(Q[st].size() > 1 && slope(Q[st][0], Q[st][1]) <= 2.0 * A * p[i]){
Q[st].pop_front();
}
int j = Q[st][0];
// cout << "i : " << i << ' ' << "j : " << j << '\n';
dp[i] = dp[j] + A * (p[i] - q[j]) * (p[i] - q[j]) + B * (p[i] - q[j]) + C;
}
ll ans = 1e18;
for(int i = 1;i <= m;i ++){
if(v[i] == n && dp[i] != 1e18){
ans = min(dp[i] + q[i], ans);
}
}
cout << ans << '\n';
return 0;
}