当前位置: 首页 > news >正文

P5468 [NOI2019] 回家路线

P5468 [NOI2019] 回家路线

大意

\(1\) 号点到第 \(n\) 号点,每个地方是一个站点,有 \(k\) 条路线,每个路线的车都有起始点和到达点,起始时间和到达时间,在等车的过程中他会哈气,问哈气值最小是什么?

思路

我们发现如果我们按时间进行排序,处理每个站点的航线的话,我们发现这样的话,后面的站点只能从前航线时间转移过来,那么这样的话我们做 DP 是没有后效性的,我们的转移是这样的,对于一个站点,若两条航线 \(v_j = u_i\),那么有:

\[dp[i] = \min_{j \in \text{valid}} \{ dp[j] + A(p_i - q_j)^2 + B(p_i - q_j) + C \} \]

我们不妨把这个转移式子拆开:

\[dp[i] = dp[j] + Ap_i^2 - 2Ap_iq_j + Aq_j^2 + Bp_i - Bq_j + C \]

再把和 \(i\)\(j\) 有关的项分开:

\[dp[i] = \underbrace{(dp[j] + Aq_j^2 - Bq_j)}_{\text{跟 } j \text{ 有关}} - \underbrace{2Ap_iq_j}_{i, j \text{ 混合}} + \underbrace{(Ap_i^2 + Bp_i + C)}_{\text{跟 } i \text{ 有关}} \]

我们发现其实是可以做斜率优化的,我们将其化为 \(y = kx + b\) 的形式:

\[\underbrace{dp[j] + Aq_j^2 - Bq_j}_{y} = \underbrace{(2Ap_i)}_{k} \cdot \underbrace{q_j}_{x} + \underbrace{(dp[i] - Ap_i^2 - Bp_i - C)}_{b} \]

接下来维护一个下凸壳即可,由于是静态的,我们可以考虑直接用单调队列维护,但是有个很大的问题是,这些站点的东西要混起来吗???那怎么能知道哪个站点的能转移的点在哪呢?很简单的方式就是,我们直接维护 \(n\) 个单调队列即可。每次对于每个站点进行转移即可。

代码

#include<iostream>
#include<queue>
#include<algorithm> 
using namespace std;#define ll long long
const int MAXN = 2 * 1e5 + 5;
int n, m;
ll A, B, C;
ll u[MAXN], v[MAXN], q[MAXN], p[MAXN], dp[MAXN];
int id1[MAXN], id2[MAXN];
deque<int> Q[MAXN >> 1];double X(int x){return q[x];
}
double Y(int x){return dp[x] + A * q[x] * q[x] - B * q[x];
}
double slope(int a, int b){if(X(a) == X(b)) return Y(a) >= Y(b) ? 1e18 : -1e18;return (Y(a) - Y(b)) / (X(a) - X(b));
}
bool cmp1(int a, int b){return p[a] < p[b];
}
bool cmp2(int a, int b){return q[a] < q[b];
}int main(){// freopen("rout.in", "r", stdin);// freopen("rout.out", "w", stdout);cin.tie(0) -> ios::sync_with_stdio(0);cin >> n >> m >> A >> B >> C;for(int i = 1;i <= m;i ++){cin >> u[i] >> v[i] >> p[i] >> q[i];id1[i] = id2[i] = i;dp[i] = 1e18;}sort(id1 + 1, id1 + m + 1, cmp1);sort(id2 + 1, id2 + m + 1, cmp2);dp[0] = q[0] = 0; v[0] = 1;Q[1].push_back(0);int nxt = 1;for(int k = 1;k <= m;k ++){int i = id1[k];while(nxt <= m && q[id2[nxt]] <= p[i]){int j = id2[nxt ++];
//            cout << j << '\n';if(dp[j] == 1e18) continue;int st = v[j];while(Q[st].size() > 1 && slope(j, Q[st][Q[st].size() - 2]) <= slope(Q[st][Q[st].size() - 2], Q[st][Q[st].size() - 1])){Q[st].pop_back();}Q[st].push_back(j);}int st = u[i];if(Q[st].empty()) continue;while(Q[st].size() > 1 && slope(Q[st][0], Q[st][1]) <= 2.0 * A * p[i]){Q[st].pop_front();}int j = Q[st][0];
//		cout << "i : " << i << ' ' << "j : " << j << '\n';dp[i] = dp[j] + A * (p[i] - q[j]) * (p[i] - q[j]) + B * (p[i] - q[j]) + C; }ll ans = 1e18;for(int i = 1;i <= m;i ++){if(v[i] == n && dp[i] != 1e18){ans = min(dp[i] + q[i], ans);}}cout << ans << '\n';return 0;
} 
http://www.jsqmd.com/news/413759/

相关文章:

  • 2026隧道泡沫箱厂家推荐:福建省首阀消防科技有限公司,全系隧道泡沫箱产品供应 - 品牌推荐官
  • 政策红利+百万缺口!网络安全领跑2026IT转行六大榜单,附学习路径全景图
  • 剪映2026破解版,会员功能能用
  • 2026年玻璃/大型/智能/负压/观赏鱼缸推荐:六如家居鱼缸全系产品适配家居办公场景 - 品牌推荐官
  • 2026年2月精选高端板材 主打健康与美学兼顾 - 速递信息
  • 绕过基于 RASP 的动态拦截技术:原理、实战与防御
  • 2026年美航草本年轻态产品推荐:美航著妍全系抗衰管理,门店加盟与团购指南 - 品牌推荐官
  • 实战指南|安科士 40G QSFP+ LR4 光模块的选型、部署与运维技巧
  • 2026年新能源充电桩冷却冷水机权威推荐:高效散热解决方案TOP3品牌实测 - 品牌推荐大师1
  • 2026年柔性生产解决方案推荐:珠海市汇斯通科技精益管接头/第二代/第三代精益管全系供应 - 品牌推荐官
  • 2026年促销礼品/礼品盒包装/结婚/春节礼品推荐:大瀛嘉与广州甄选多场景解决方案 - 品牌推荐官
  • 凯氏定氮仪技术深度解析:从经典化学到自动化检测的演进与实战应用
  • 关于`WinForm`中页面“消失”的解决方案
  • 2026年混凝土企业信息化管理软件推荐:郑州圣兰软件科技,干混砂浆/商砼/拌合站ERP系统全覆盖 - 品牌推荐官
  • 自由职业个人服务数字宣传手册,手册点开就能看。
  • 2026中空吹塑机优质厂家推荐榜高稳定高成品率:浮球吹塑机、浮筒吹塑机、玩具吹塑机、华泰吹塑机、吹塑机加工、围挡吹塑机选择指南 - 优质品牌商家
  • 2026气膜建筑领域实力推荐:河南科琦智能科技,气膜煤仓/体育馆/馆/基坑气膜全系解决方案 - 品牌推荐官
  • 2026年磨粉设备推荐:黎明重工超细/矿石/欧版/雷蒙/立式磨粉机全系解决方案 - 品牌推荐官
  • SQL 语句中 left join 后用 on 还是 where,区别大了!
  • 2026烘干设备推荐:河南科勒夫设备科技银杏叶/石膏/污泥/酒糟/煤泥/三筒烘干机全解析 - 品牌推荐官
  • Go 语言系统编程与云原生开发实战(第23篇)
  • 以方盾护呼吸,以坚守安匠心
  • 中电金信 :以智能高效驱动数据生产,打造数据开发新范式
  • 2026年食用油精炼设备厂家推荐:郑州中赢机械设备有限公司,多品类油脂精炼解决方案 - 品牌推荐官
  • 2026年沈阳娱乐KTV推荐:PartyKIng派对之王,商务/主题/经典/豪华KTV全场景适配 - 品牌推荐官
  • 2026 生物医药及电子半导体行业厂房机电安装工程公司推荐 - 品牌2025
  • 期货与期权一体化平台参数输入表格设计
  • Go 语言系统编程与云原生开发实战(第22篇)
  • 2026年玻璃隔断专业厂家推荐:沈阳市苏家屯区双赢装饰装修材料经营部,全系玻璃隔断产品供应 - 品牌推荐官
  • 2026年波纹管厂家实力推荐:重庆元能管业,钢带/HDPE/双壁/MPVE波纹管全品类供应 - 品牌推荐官