萌新求助 | 数据过水
查看原帖
萌新求助 | 数据过水
173660
zhoukangyang楼主2021/3/4 07:40

萌新求助,为什么挂了? (WA推导link)

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j, i##E = k; i <= i##E; i++)
#define R(i, j, k) for(int i = j, i##E = k; i >= i##E; i--)
#define ll long long
#define db double
#define pii pair<int, int>
#define mkp make_pair
#define sz(a) ((int) (a).size())
using namespace std;
const int N = 1e6 + 7;
template<typename T> inline void cmax(T &x, T y) { if(x < y) x = y; }
template<typename T> inline void cmin(T &x, T y) { if(y < x) x = y; }
int n, m, A, B, C, *q[N], h[N], t[N], sz[N];
ll ns = 1e18;
struct node {
	int p, q, x, y; 
	ll w, d;
} s[N];
vector<int> v[N];
double slope(int x, int y) {
	return (db) (s[x].d - s[y].d) / (s[x].q - s[y].q);
}
void ad(int x) {
	s[x].d = s[x].w + ((ll) A * s[x].q - B) * s[x].q;
	int v = s[x].y, st;
	if(h[v] <= t[v] && s[st = q[v][t[v]]].q == s[x].q) {
		if(s[x].w < s[st].w) --t[v], q[v][++t[v]] = x;
		return ;
	}
	while(h[v] < t[v] && slope(q[v][t[v] - 1], q[v][t[v]]) >= slope(q[v][t[v]], x)) -- t[v];
	q[v][++t[v]] = x;
}
ll F(int x) {
	return ((ll) A * x + B) * x + C;
}
int pos[N];
void qry(int x) {
	int v = s[x].x;
	if(h[v] > t[v]) 
		return s[x].w = 1e18, void();
	while(h[v] < t[v] && 2ll * A * s[x].p >= slope(q[v][h[v]], q[v][h[v] + 1])) ++h[v];
	s[x].w = F(s[x].p - s[q[v][h[v]]].q) + s[q[v][h[v]]].w;

	// s[x].w = 1e18;
	// L(i, pos[v], t[v]) 
	// 	if(s[x].w > F(s[x].p - s[q[v][i]].q) + s[q[v][i]].w) pos[v] = i, s[x].w = F(s[x].p - s[q[v][i]].q) + s[q[v][i]].w;
}
int main() {
	freopen("route.in", "r", stdin);
	// freopen("route.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> A >> B >> C;
	L(i, 1, m) {
		cin >> s[i].x >> s[i].y >> s[i].p >> s[i].q;
		sz[s[i].y] ++;
	}
	L(i, 1, n) q[i] = new int [sz[i] + 1], pos[i] = h[i] = 1;
	sort(s + 1, s + m + 1, [&] (node aa, node bb) {
		return aa.p < bb.p;
	});
	L(i, 1, m) v[s[i].q].push_back(i);
	q[1][++t[1]] = 0, s[0].x = s[0].y = 1;
	L(i, 1, m) {
		L(j, s[i - 1].p + 1, s[i].p) 
			for(int x : v[j]) ad(x);
		qry(i);	
	}
	L(i, 1, m) if(s[i].y == n) cmin(ns, s[i].w + s[i].q);
	cout << ns << "\n";
	return 0;
} 

中间代码中有:

while(h[v] < t[v] && 2ll * A * s[x].p >= slope(q[v][h[v]], q[v][h[v] + 1])) ++h[v];
	s[x].w = F(s[x].p - s[q[v][h[v]]].q) + s[q[v][h[v]]].w;

// s[x].w = 1e18;
// L(i, pos[v], t[v]) 
// 	if(s[x].w > F(s[x].p - s[q[v][i]].q) + s[q[v][i]].w) pos[v] = i, s[x].w = F(s[x].p - s[q[v][i]].q) + s[q[v][i]].w;

我把我注释的语句替换掉没有注释的(没注释的就是利用决策单调性,但是复杂度显然爆炸),然后就 AC 了???(在 uoj 上也过了???)

求助 /kel

2021/3/4 07:40
加载中...