传送门

题意:给定MMM个班车,每个班车pip_ipi​时刻从xix_ixi​发车qiq_iqi​到达yiy_iyi​,等车ttt时间花费代价At2+Bt+CAt^2+Bt+CAt2+Bt+C,在ttt时刻到达花费ttt的代价,求从111到NNN的最小花费。

1≤N≤100000,1≤M≤2000001 \leq N \leq 100000,1 \leq M \leq 2000001≤N≤100000,1≤M≤200000

显然是个dp

容易想到一个二维dp,第一维记当前位置,第二维记时间

由于数据范围很大,所以需要优化掉一维

仔细想想为什么需要两维?

因为位置是有后效性的,需要用时间节点来标记。

而时间是一去不复返的,是个天然的无后效性状态。

所以可以考虑按时间dp,先假设没有位置限制。

此题对时间唯一的限制是不能冲突,所以按照班车的时间段dp。

假设可以瞬间移动,不计最终代价,设坐上第iii辆班车的最小代价是fif_ifi​

fi=min⁡qj≤pi{fj+A(pi−qj)2+B(pi−qj)+C}f_i=\min_{q_j \leq p_i}\{f_j+A(p_i-q_j)^2+B(p_i-q_j)+C\}fi​=qj​≤pi​min​{fj​+A(pi​−qj​)2+B(pi​−qj​)+C}

盲猜斜率优化

假设决策j,kj,kj,k有j<kj<kj<k,kkk比jjj优

fk+A(pi−qj)2+B(pi−qj)+C≤fj+A(pi−qj)2+B(pi−qj)+Cf_k+A(p_i-q_j)^2+B(p_i-q_j)+C\leq f_j+A(p_i-q_j)^2+B(p_i-q_j)+Cfk​+A(pi​−qj​)2+B(pi​−qj​)+C≤fj​+A(pi​−qj​)2+B(pi​−qj​)+C

fk+A(pi−qj)2+B(pi−qj)≤fj+A(pi−qj)2+B(pi−qj)f_k+A(p_i-q_j)^2+B(p_i-q_j)\leq f_j+A(p_i-q_j)^2+B(p_i-q_j)fk​+A(pi​−qj​)2+B(pi​−qj​)≤fj​+A(pi​−qj​)2+B(pi​−qj​)

fk+Api2−2Apiqk+qk2+Bpi−Bqk≤fj+Api2−2Apiqj+qj2+Bpi−Bqjf_k+Ap_i^2-2Ap_iq_k+q_k^2+Bp_i-Bq_k \leq f_j+Ap_i^2-2Ap_iq_j+q_j^2+Bp_i-Bq_jfk​+Api2​−2Api​qk​+qk2​+Bpi​−Bqk​≤fj​+Api2​−2Api​qj​+qj2​+Bpi​−Bqj​

fk−2Apiqk+qk2−Bqk≤fj−2Apiqj+qj2−Bqjf_k-2Ap_iq_k+q_k^2-Bq_k \leq f_j-2Ap_iq_j+q_j^2-Bq_jfk​−2Api​qk​+qk2​−Bqk​≤fj​−2Api​qj​+qj2​−Bqj​

2Api+B≥fk+qk2−fj−qj2qk−qj2Ap_i+B \geq\frac{f_k+q_k^2-f_j-q_j^2}{q_k-q_j}2Api​+B≥qk​−qj​fk​+qk2​−fj​−qj2​​

发现ppp和qqq分开了(其实不分开也能做的说)

所以可以把出发和到达拆开,分别排序,双指针维护

考虑位置限制

对于一个pip_ipi​,只有yj=xiy_j=x_iyj​=xi​的qjq_jqj​会更新答案

所以可以用vector存NNN个凸壳

遇到出发在对应结点的凸壳上算出fff。因为脑袋抽了写了个二分。

遇到到达在对应结点用之前的fff更新凸壳

最后能到达NNN的算答案。

当时做的时候式子推反了,然后二分的时候凸壳算反了就负负得正A了……

我可能是个傻子

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
#define MAXN 200005
using namespace std;
struct event{int idx,pos,tim;}st[MAXN],ed[MAXN];
inline bool cmp(const event& a,const event& b){return a.tim<b.tim;}
int n,m,A,B,C;
int f[MAXN];
inline int Y(const int& i){return f[ed[i].idx]+ed[i].tim*ed[i].tim;}
inline int calc(const int& i,const int& j)
{int d=st[i].tim-ed[j].tim;return f[ed[j].idx]+A*d*d+B*d+C;
}
vector<int> v[MAXN];
int vis[MAXN];
int main()
{scanf("%d%d%d%d%d",&n,&m,&A,&B,&C);for (int i=1;i<=m;i++){int x,y,p,q;scanf("%d%d%d%d",&x,&y,&p,&q);st[i]=(event){i,x,p};ed[i]=(event){i,y,q};}memset(f,0x7f,sizeof(f));sort(st+1,st+m+1,cmp);sort(ed+1,ed+m+1,cmp);int now=0;for (int i=1;i<=m;i++){while (now<m&&ed[now+1].tim<=st[i].tim){++now;if (vis[ed[now].idx]) continue;vector<int>& cur=v[ed[now].pos];while (cur.size()>1&&(Y(now)-Y(cur[cur.size()-1]))*(ed[cur[cur.size()-1]].tim-ed[cur[cur.size()-2]].tim)<=((Y(cur[cur.size()-1])-Y(cur[cur.size()-2]))*(ed[now].tim-ed[cur[cur.size()-1]].tim))) cur.pop_back();cur.push_back(now);}if (st[i].pos==1) f[st[i].idx]=A*st[i].tim*st[i].tim+B*st[i].tim+C;else{vector<int>& cur=v[st[i].pos];if (cur.size()){int l=0,r=cur.size()-1,mid;while (l<r){mid=(l+r)>>1;if ((2*A*st[i].tim+B)*(ed[cur[mid+1]].tim-ed[cur[mid]].tim)<=Y(cur[mid+1])-Y(cur[mid])) r=mid;else l=mid+1;}f[st[i].idx]=calc(i,cur[l]);}else vis[st[i].idx]=true;}}int ans=f[0];for (int i=1;i<=m;i++) if (ed[i].pos==n) ans=min(ans,f[ed[i].idx]+ed[i].tim);printf("%d\n",ans);return 0;
}

【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】相关推荐

  1. luogu P5468 [NOI2019]回家路线 (斜率优化、DP)

    题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...

  2. [NOI2019]回家路线

    LOJ3156 题面就不放了 , 放一下数据范围 . 看到 \(n<=2000,m<=4000\) 就想到直接 \(dfs\) 到底 , 居然就过了前 \(4\)个 样例 , 最后一个要 ...

  3. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  4. LOJ 3156: 「NOI2019」回家路线

    题目传送门:LOJ #3156. 题意简述: 有一张 \(n\) 个点 \(m\) 条边的有向图,边有两个权值 \(p_i\) 和 \(q_i\)(\(p_i<q_i\))表示若 \(p_i\) ...

  5. 维护无后效性的技巧——立即计算代价

    简介 无后效性是动态规划的一个基本特征之一,只有具备了无后效性的问题才可以使用动态规划求解.直观上讲,无后效性是指"现在不会影响未来",或者说现在的决策不会影响未来如何决策.一个不 ...

  6. 动态规划的最优原理与无后效性解析

    什么样的"多阶段决策问题"才可以采用动态规划的方法求解 一般来说,能够采用动态规划方法求解的问题,必须满足最优化原理和无后效性原则: 1.动态规划的最优化原理.作为整个过程的最优策 ...

  7. 从零开始,带你掌握空状态设计的正确方法

    作者:Jenny黄静雯 全文共 2885 字 17 图,阅读需要 7 分钟 ---- / BEGIN / ---- 空状态是APP内必然存在的一个状态,适宜的空状态设计可以提升用户体验,实现用户留存. ...

  8. 有后效性和无后效性的通俗理解

    无后效性是动态规划算法及贪心算法的前提条件 无后效性:某阶段的状态一旦确定,则此后过程的决策不再受此前各种状态及决策的影响. 有后效性:就是某个状态之后要做的决策会受之前的状态及决策的影响. 举例:如 ...

  9. 航天器的“回家路线”有几种

    有些航天器,如返回式卫星.载人飞船和航天飞机等,在完成任务后要返回地球.它们的"回家路线",即从脱离运行轨道到降落地面这一段的飞行轨迹叫返回轨道. 根据航天器在返回轨道上所受阻力和 ...

最新文章

  1. java n个点 凸多边形_hrbustoj 1291 点在凸多边形内
  2. C语言----字符串左旋
  3. cover letter 转
  4. kafka后台启动命令
  5. 樊登高效休息法心得400字_真的,你应该早点知道这个高效学习方法
  6. 学习方法之02掌握记忆方法,在学习上就赢了一半
  7. 【2019.09.08】2019icpc南昌网络赛
  8. 看unix高级编程时遇到apue.h找不到的问题
  9. Windows 下使用ftp批处理脚本
  10. 项目开发中如何提升团队的战力?
  11. 排序算法第六篇——堆排序
  12. squid不能启动问题及解决方法
  13. linux查看默认启动服务
  14. PDF 文档解除密码
  15. 超星高级语言程序设计实验作业 (实验02 分支与循环程序设计)(一)
  16. opencv 模板匹配形状匹配
  17. 浅谈微积分以及泰勒展开
  18. 【学习笔记】计算机基础知识
  19. 蓝奏云分享链接打不开修改host
  20. php通过udp上报日志,PHP日志扩展SeasLog-1.6.0,支持TCP,UDP发送

热门文章

  1. tensorflow去掉某一维度_在Python中解压缩(取消堆栈)一个输入(占位符),在tensorflow中有一个None维度...
  2. python程序 爱意_[Python]快学学怎么Python爬一段情书送女朋友吧
  3. 吃屎是一种什么样的体验?
  4. 就想问问你们,这种女朋友从哪里来的?
  5. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  6. 刚刚!华为mate30 pro全球首发,三星黯然失色,iPhone11甚至都被吓降价了
  7. led可见光通信直方图均衡matlab,基于RGB型LED的光学相机通信系统的实现方案
  8. node.js require 自动执行脚本 并生成html,nodejs 执行脚本并实时输出
  9. java八进制转十六进制_java-十进制、八进制、十六进制数互相转换
  10. 基本系统设备感叹号更新不了_电脑识别不了U盘?别紧张,免费教你如何解决...