85分,调了好久了,救救孩子吧
查看原帖
85分,调了好久了,救救孩子吧
71956
dustbin1415楼主2021/9/29 21:17
#include <bits/stdc++.h>
using namespace std;
long long n, m, A, B, C;
long long dp[10005], ans = 0x7fffffffffffffff;
struct Train
{
    long long x, y, p, q;
    int No;
    inline bool operator<(const Train &x) const //重载运算符
    {
        return x.q < q;
    }
} train[1000005];
deque<int> que[100005];
priority_queue<Train> heap;
inline bool cmp(Train x, Train y)
{
    return x.p == y.q ? x.q < y.q : x.p < y.p;
}
inline double slope(int a, int b)
{
    return (double)(dp[a] + A * train[a].q * train[a].q - B * train[a].q - dp[b] - A * train[b].q * train[b].q + B * train[b].q) / (double)(train[a].q - train[b].q);
}
int main()
{
    memset(dp, 127, sizeof(dp));
    scanf("%lld %lld %lld %lld %lld", &n, &m, &A, &B, &C);
    for (int i = 1; i <= m; i++)
    {
        scanf("%lld %lld %lld %lld", &train[i].x, &train[i].y, &train[i].p, &train[i].q);
    }
    sort(train + 1, train + m + 1, cmp);
    for (int i = 1; i <= m; i++)
    {
        train[i].No = i, heap.push(train[i]);
        if (train[i].x == 1)
            dp[i] = A * train[i].p * train[i].p + B * train[i].p + C;
    }
    for (int i = 1; i <= m; i++)
    {
        int s = train[i].x, e, t = 0;
        if (!heap.empty())
            while (heap.top().q <= train[i].p)
            {
                e = heap.top().y;
                if (que[e].size() > 1)
                    while (slope(heap.top().No, *(que[e].begin() + 1)) <= slope(*(que[e].begin()), *(que[e].begin() + 1)))
                    {
                        que[e].pop_front();
                        if (que[e].size() < 2)
                            break;
                    }
                que[e].push_front(heap.top().No);
                heap.pop();
                if (heap.empty())
                    break;
            }
        if (que[s].size() > 1)
            while (slope(*(que[s].end() - 2), *(que[s].end() - 1)) <= 2 * A * train[i].p)
            {
                que[s].pop_back();
                if (que[s].size() < 2)
                    break;
            }
        if (!que[s].empty())
        {
            t = train[i].p - train[*(que[s].end() - 1)].q;
            dp[i] = min(dp[*(que[s].end() - 1)] + A * t * t + B * t + C, dp[i]);
        }
    }
    for (int i = 1; i <= m; i++)
    {
        if (train[i].y == n)
            ans = min(ans, dp[i] + train[i].q);
    }
    printf("%lld\n", ans);
    return 0;
}
2021/9/29 21:17
加载中...