比赛 寒假集训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;
}