【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】
传送门
题意:给定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=minqj≤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≤pimin{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−2Apiqk+qk2+Bpi−Bqk≤fj+Api2−2Apiqj+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−2Apiqk+qk2−Bqk≤fj−2Apiqj+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−qjfk+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状态设计】【斜率优化】相关推荐
- luogu P5468 [NOI2019]回家路线 (斜率优化、DP)
题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...
- [NOI2019]回家路线
LOJ3156 题面就不放了 , 放一下数据范围 . 看到 \(n<=2000,m<=4000\) 就想到直接 \(dfs\) 到底 , 居然就过了前 \(4\)个 样例 , 最后一个要 ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- LOJ 3156: 「NOI2019」回家路线
题目传送门:LOJ #3156. 题意简述: 有一张 \(n\) 个点 \(m\) 条边的有向图,边有两个权值 \(p_i\) 和 \(q_i\)(\(p_i<q_i\))表示若 \(p_i\) ...
- 维护无后效性的技巧——立即计算代价
简介 无后效性是动态规划的一个基本特征之一,只有具备了无后效性的问题才可以使用动态规划求解.直观上讲,无后效性是指"现在不会影响未来",或者说现在的决策不会影响未来如何决策.一个不 ...
- 动态规划的最优原理与无后效性解析
什么样的"多阶段决策问题"才可以采用动态规划的方法求解 一般来说,能够采用动态规划方法求解的问题,必须满足最优化原理和无后效性原则: 1.动态规划的最优化原理.作为整个过程的最优策 ...
- 从零开始,带你掌握空状态设计的正确方法
作者:Jenny黄静雯 全文共 2885 字 17 图,阅读需要 7 分钟 ---- / BEGIN / ---- 空状态是APP内必然存在的一个状态,适宜的空状态设计可以提升用户体验,实现用户留存. ...
- 有后效性和无后效性的通俗理解
无后效性是动态规划算法及贪心算法的前提条件 无后效性:某阶段的状态一旦确定,则此后过程的决策不再受此前各种状态及决策的影响. 有后效性:就是某个状态之后要做的决策会受之前的状态及决策的影响. 举例:如 ...
- 航天器的“回家路线”有几种
有些航天器,如返回式卫星.载人飞船和航天飞机等,在完成任务后要返回地球.它们的"回家路线",即从脱离运行轨道到降落地面这一段的飞行轨迹叫返回轨道. 根据航天器在返回轨道上所受阻力和 ...
最新文章
- java n个点 凸多边形_hrbustoj 1291 点在凸多边形内
- C语言----字符串左旋
- cover letter 转
- kafka后台启动命令
- 樊登高效休息法心得400字_真的,你应该早点知道这个高效学习方法
- 学习方法之02掌握记忆方法,在学习上就赢了一半
- 【2019.09.08】2019icpc南昌网络赛
- 看unix高级编程时遇到apue.h找不到的问题
- Windows 下使用ftp批处理脚本
- 项目开发中如何提升团队的战力?
- 排序算法第六篇——堆排序
- squid不能启动问题及解决方法
- linux查看默认启动服务
- PDF 文档解除密码
- 超星高级语言程序设计实验作业 (实验02 分支与循环程序设计)(一)
- opencv 模板匹配形状匹配
- 浅谈微积分以及泰勒展开
- 【学习笔记】计算机基础知识
- 蓝奏云分享链接打不开修改host
- php通过udp上报日志,PHP日志扩展SeasLog-1.6.0,支持TCP,UDP发送
热门文章
- tensorflow去掉某一维度_在Python中解压缩(取消堆栈)一个输入(占位符),在tensorflow中有一个None维度...
- python程序 爱意_[Python]快学学怎么Python爬一段情书送女朋友吧
- 吃屎是一种什么样的体验?
- 就想问问你们,这种女朋友从哪里来的?
- 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
- 刚刚!华为mate30 pro全球首发,三星黯然失色,iPhone11甚至都被吓降价了
- led可见光通信直方图均衡matlab,基于RGB型LED的光学相机通信系统的实现方案
- node.js require 自动执行脚本 并生成html,nodejs 执行脚本并实时输出
- java八进制转十六进制_java-十进制、八进制、十六进制数互相转换
- 基本系统设备感叹号更新不了_电脑识别不了U盘?别紧张,免费教你如何解决...