首页 > 其他分享 >回家路线

回家路线

时间:2024-03-04 20:00:45浏览次数:12  
标签:班次 队列 回家 路线 斜率 一个点 排序 单调

一道好题

首先肯定是DP,考虑如何DP

我们发现可以尝试按照乘坐的列车编号的序列进行DP

设\(f[i]\)表示某种列车序列,最后一趟车是第\(i\)个班次的最小花费

那么显然有\(f[i]=f[j]+A(p_i-q_k)^2+B(p_i-q_j)+C\)

打开之后发现有\(i\)和\(j\)的乘积项,所以想到斜率优化

移项后变成\(2Ap_iq_j+f_i-Ap_i^2-Bp_i-C=f_j+Aq_j^2-Bq_j\),其中要求\(y_j=x_i,q_j≤p_i\)

考虑如何优化,我们肯定要将原来的列车班次进行某种排序,然后进行线性DP

这里肯定要么按照\(p\)排序,要么按照\(q\)排序

我们先按照\(q\)排序,不难发现是维护斜率单调递增

我们把每一个已经DP好了的\(f[i]\)按照其\(y\)值放在对应的单调队列里面(也就是一共有\(n\)个单调队列),在计算某一个\(f[i]\)的时候,我们只需要在\(x_i\)对应的单调队列里面去查找即可

这样就对了吗?

其实是不行的。首先,\(2Ap_i\)显然不一定单调,所以我们要用二分,而且还要先用二分在这个单调队列里面查找出来满足\(q_j≤p_i\)的位置;其次,可能存在一种情况,如下

如图所示,\(4\)号点的进行会将\(3\)号点弹出去,但有可能\(3\)号点是满足\(q_j≤p_i\)的最大位置,那么\(3\)号点是有可能成为最优决策的

那么解决这个的办法是什么?我们就选择不弹出某个点,而是记录某个点如果进行普通的斜率优化的单调队列的话,他的前一个点是哪一个点,设为\(t[i]\)。假设新进来一个点,我们就比较这个点和当前单调队列的最后一个点的斜率与当前单调队列的最后一个点和其\(t\)(设这个点为\(x\))的斜率大小来决定是否“弹出”当前单调队列的最后一个点(注意我们并不会真的弹出当前单调队列的最后一个点);如果要“弹出”,那么就继续比较新进来的这个点和\(x\)的斜率与\(x\)和其\(t\)的斜率来决定是否“弹出”\(x\),依次类推。不难发现时间复杂度仍然正确(相当于还是每个点最多进队出队一次)。但是这个做法对后面的二分查找就很麻烦了,我只想到了倍增

提醒一下,如果某一趟班次的\(x=1\),这一趟班次不一定非要放在第一个,我们可以先做其他车,最后回到\(1\)号站,然后再作这一趟班次,可能时间会更优

以上解法是对\(q\)排序,但是代码很难写,那么我们尝试对\(p\)排序

此时对\(p\)排序之后,就解决了斜率不是单调递增的问题(指解决的这个问题:首先,$2Ap_i$显然不一定单调,所以我们要用二分

然后仍然需要满足\(y_j=x_i,q_j≤p_i\)

第一个条件的处理跟之前一样,就不赘述了

问题是第二个条件的处理

我们想的是某一时刻,当我们更新\(f[i]\)的时候,对应的单调队列的所有点都可以用,就可以忽略第二个条件了

为了达到这种效果,我们更新了\(f[i]\)之后,不要马上把\(f[i]\)插入其对应的单调队列,而是选择放到一个桶里面(对应这一趟班次的\(p\)值);然后我们在每次更新\(f[i]\)之前,先把所有小于等于\(p_i\)的桶里面的班次全部插入到对应的单调队列里面就好了

标签:班次,队列,回家,路线,斜率,一个点,排序,单调
From: https://www.cnblogs.com/dingxingdi/p/18052535

相关文章

  • 强化学习学习路线
    1、强化学习介绍强化学习是指智能体通过与环境进行交互,不断的通过试错,以获得更大的累计奖励为目的,得到更好的策略。强化学习的学习路线比较陡峭,因为涉及到的数学知识更多一些,需要概率论、随机过程的知识。这里通过我自己的一些学习经验以及看过的一些资料,整理了一条逐渐深入的学......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......
  • 界面控件DevExpress WinForms 2024产品路线图预览(一)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!本文将介绍2024年DevExpressWinForms第一个主要更新......
  • JAVA 学习路线
    1.首先是java基础(常用类,集合和IO)2.其次就是GUI编程3.学习网络编程和多线程基础4.对注解和反射进行了解5.有兴趣可以学习JVM(JUC并发编程以后再看)6.html5和CSS3和JS适当了解7.MYSQL数据库重点 Javaweb基础一定打好 这两个非常重要8.mybatis框架spring5和springmvc框......
  • 洛谷题单指南-递推与递归-P2437 蜜蜂路线
    原题链接:https://www.luogu.com.cn/problem/P2437题意解读:根据题目要求,只能从标号小的蜂房爬到标号大的相邻蜂房,即每次要么爬到+1的蜂房,要么爬到+2的蜂房,本质上是一个斐波那契数列问题,和数楼梯问题一样。解题思路:要求从m号蜂房到n号蜂房的路径,即走n-m级楼梯的方案,n最大1000,同样......
  • 耗时一个月我问遍了身边的大佬,零基础自学Java的路线,适用程序员入门&进阶,Java学习路线,2
    作为一个有志于成为Java程序员的你,或许正处在技术生涯的起点,或许已经走过了入门的道路,期待跨越进阶的门槛?无论处于哪个阶段,一条明确的学习路线都至关重要,通过向众多行业大佬请教、反复探索和实践,总结出一套适用于零基础自学者大学四年Java学习路线,也同样适用于从初级到研发专家的学......
  • 【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
    蜜蜂路线题目描述一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房开始爬到蜂房,,有多少种爬行路线?(备注:题面有误,右上角应为)输入格式输入的值输出格式爬行有多少种路线样例#1样例输入#1114样例输出#1377提示对于100%的......