全输出正无穷 0 pts 求助
查看原帖
全输出正无穷 0 pts 求助
719978
DYYqwq楼主2024/1/27 19:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
	int x , y , p , q;
	bool operator < (const node &qwq)
	{
		return p < qwq.p;
	}
}e[1000010];
int n , m , A , B , C , dp[1000010] , path[1000010] , q[1000010] , head = 1 , tail = 1;
int X(int x)
{
	return e[x].q;
}
int Y(int x)
{
	return dp[x] + A * e[x].q * e[x].q - B * e[x].q;
}
double k(int x , int y)
{
	if(X(x) == X(y))
	{
		if(Y(x) < Y(y)) return 1e18;
		else return -1e18;
	}
	return 1.0 * (Y(x) - Y(y)) / (X(x) - X(y));
}
signed main()
{
	freopen("route3.in" , "r" , stdin); 
	memset(dp , 0x3f , 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" , &e[i].x , &e[i].y , &e[i].p , &e[i].q);
	sort(e + 1 , e + m + 1);
	for(int i = 1 ; i <= m ; i ++) if(e[i].x == 1) dp[i] = min(dp[i] , A * e[i].p * e[i].p + B * e[i].p + C) , q[++ tail] = i;
	for(int i = 1 ; i <= m ; i ++)
	{
		/*
		for(int j = 1 ; j <= m ; j ++)
		{
			int tmp = e[i].p - e[j].q; 
			if(e[i].x == e[j].y && e[j].q <= e[i].p)
			{
				int qwq = dp[i];
				dp[i] = min(dp[i] , dp[j] + A * tmp * tmp + B * tmp + C);
				if(qwq > dp[i]) path[i] = j;
			}
		}
		*/
		while(head < tail && (k(q[head] , q[head + 1]) < 2 * A * e[i].p || e[i].x != e[q[head]].y || e[i].p < e[q[head]].q)) head ++;
		int tmp = e[i].p - e[q[head]].q;
		if(e[i].x == e[q[head]].y && tmp >= 0) dp[i] = min(dp[i] , dp[q[head]] + A * tmp * tmp + B * tmp + C);
		while(head < tail && (k(q[tail - 1] , q[tail]) > k(q[tail] , i))) tail --;
		if(dp[i] != 0x3f3f3f3f) q[++ tail] = i;
	}
	int ans = 1e18;
	// for(int i = 1 ; i <= m ; i ++) printf("%lld %lld\n" , dp[i] + q[i] , path[i]);
	for(int i = 1 ; i <= m ; i ++) if(e[i].y == n) ans = min(ans , dp[i] + e[i].q);
	if(ans == 1e18) return 1;
	printf("%lld\n" , ans);
	return 0;
}
2024/1/27 19:05
加载中...