萌新刚学斜率优化 1ms 求调
查看原帖
萌新刚学斜率优化 1ms 求调
974277
水星湖psgqwq楼主2025/6/30 22:43
#include <bits/stdc++.h>
using namespace std;

namespace z {

#define int long long
const int N = 2e5 + 5;
int n, m, A, B, C;
int x[N], y[N], p[N], q[N];
int f[N];
deque<int> dq[N];
vector<int> bg[N];
vector<int> ed[N];
vector<int> wt[N];
int X(int j) { return q[j];}
int Y(int j) { return f[j] - B * q[j] + A * q[j] * q[j]; }
long double K(int i, int j) { return (long double)(Y(i) - Y(j)) / (X(i) - X(j)); }

void main() {

    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    cin >> n >> m >> A >> B >> C;
    for(int i = 1; i <= n; i++) dq[i].clear();
    for(int i = 1; i <= m; i++) {
        cin >> x[i] >> y[i] >> p[i] >> q[i];
        bg[p[i]].push_back(i);
        ed[q[i]].push_back(i);
    }
    // memset(f, 0x3f, sizeof(f)); f[0] = 0;
    ed[0].push_back(0); y[0] = 1;
    int T = *max_element(q + 1, q + m + 1);
    for(int i = 0; i <= T; i++) {
        for(int j : ed[i]) {
            wt[y[j]].push_back(j);
        }
        for(int j : bg[i]) {
            for(int k : wt[x[j]]) {
                int t = y[k];
                while(dq[t].size() >= 2 && K(dq[t][dq[t].size() - 2], dq[t].back()) > K(dq[t].back(), k))
                    dq[t].pop_back();
                dq[t].push_back(k);
            }
            wt[x[j]].clear();
            while(dq[x[j]].size() >= 2 && K(dq[x[j]][0], dq[x[j]][1]) < 2 * A * p[j])
                dq[x[j]].pop_front();
            if(dq[x[j]].size()) {
                int k = dq[x[j]].front();
                f[j] = f[k] + A * (p[j] - q[k]) * (p[j] - q[k]) + B * (p[j] - q[k]) + C;
            } else f[j] = 1e14;
        }
    }
    int ans = 9e18;
    for(int i = 1; i <= m; i++)
        if(y[i] == n) ans = min(ans, f[i] + q[i]);
    cout << ans << '\n';
}

#undef int

}

int main()
{
    z::main();
    return 0;
}

2025/6/30 22:43
加载中...