斜率优化 WA 90 求助
查看原帖
斜率优化 WA 90 求助
131591
蒟蒻君HJT泽渡透香楼主2022/6/28 12:06

WA 在 点 14 和 19 上,答案偏大,有可能是精度的问题,但是查不出来。。

#include <bits/stdc++.h>
int n, m, A, B, C;
struct poi{
	int x, y, id;
};
std::vector<poi>c[1005];
struct node{
	int l, r;
	std::vector<poi>v;
	inline double slope(poi a, poi b){
		if(a.x == b.x) {
			if(a.y >= b.y) return (double)2e9;
			else return (double)-2e9;
		}
		return (double)(a.y - b.y) / (double)(a.x - b.x);
	}
	inline poi pop(int k){
		while(l < r && slope(v[l + 1], v[l]) < (double) k) ++l;
		if(l > r) return (poi){-1, -1, -1};
		return v[l];
	}
	inline void push(poi u){
		while(l < r && slope(v[r], v[r - 1]) > slope(u, v[r])) --r;
		++r;
		v.push_back(u);
		return ;
	}
}d[100005];
int dp[200005], vis[200005];
struct route{
	int u, v, p, q;
}r[200005];
inline bool cmp(route a, route b){
	return a.p < b.p;
}
signed main(){
	//freopen("route19.in", "r", stdin);
	scanf("%d%d%d%d%d", &n, &m, &A, &B, &C);
	for(int i = 1; i <= n; ++i) d[i].l = 0, d[i].r = -1;
	for(int i = 1; i <= m; ++i)
		scanf("%d%d%d%d", &r[i].u, &r[i].v, &r[i].p, &r[i].q);
	std::sort(r + 1, r + m + 1, cmp);
	poi o;
	o.x = 0, o.y = 0;
	r[0].p = 0;
	d[1].push(o);
	for(int i = 1; i <= m; ++i){
		for(int j = r[i - 1].p + 1; j <= r[i].p; ++j){
			for(int k = 0; k < c[j].size(); ++k){
				d[c[j][k].id].push(c[j][k]);
			}
		}
		poi s = d[r[i].u].pop(2 * A * r[i].p);
		if(s.id == -1) {
			vis[i] = 1;
			continue;
		}
		dp[i] = s.y - 2 * A * r[i].p * s.x + 
		A * r[i].p * r[i].p + B * r[i].p + C;
		c[r[i].q].push_back((poi){r[i].q, dp[i] + A * r[i].q * r[i].q - B * r[i].q, r[i].v});
	}
	int Ans = -1 + (1 << 30) + (1 << 30);
	for(int i = 1; i <= m; ++i)
		if(!vis[i] && r[i].v == n)
			Ans = std::min(Ans, dp[i] + r[i].q);
	printf("%d\n", Ans);
	return 0;
}
2022/6/28 12:06
加载中...