令$dp[i]$表示经过第$i$条边后的最小烦躁值,有$且dp[i]=\min_{y_{j}=x_{i}且q_{j}\le p_{i}}dp[j]+f(p_{i}-q_{j})$,其中$f(x)=Ax^{2}+Bx+C$
由于$p_{j}<q_{j}\le p_{i}$,按$p_{i}$从小到大枚举,当$q_{j}\le p_{i}$时将信息记在$y_{j}$上,求$dp[i]$时枚举$x_{i}$上的信息即可,复杂度$o(m^{2})$
将后面的式子拆开,提出与$j$无关的部分,即$且dp[i]=f(p_{i})+\min_{y_{j}=x_{i}且q_{j}\le p_{i}}-2Ap_{i}q_{j}+(dp[j]+Aq_{j}^2-Bq_{j})$
将后半部分看作$F_{j}(x)=-2Aq_{j}x+(dp[j]+Aq_{j}^2-Bq_{j})$的直线,对每一个点用凸包来维护这些直线,利用斜率$q_{j}$和询问$p_{i}$的单调性可以做到均摊$o(1)$
复杂度计算:每一条直线插入/询问一次,插入/删除均摊均为$o(1)$,总复杂度$o(m)$;对$p_{j}\le p_{i}<q_{j}$的直线维护一个$set$,复杂度为$o(m\log m)$(对$q$排序可以做到$o(m)$,但排序复杂度也为$o(m\log m)$)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define k(i) -2*A*e[i].q
5 #define b(i) (dp[i]+A*e[i].q*e[i].q-B*e[i].q)
6 struct ji{
7 int x,y,p,q;
8 }e[N];
9 vector<int>v[N];
10 set<pair<int,int> >s;
11 int n,m,A,B,C,ans,sz[N],dp[N];
12 bool cmp(ji x,ji y){
13 return x.p<y.p;
14 }
15 double point(int x,int y){
16 if (k(x)==k(y)){
17 if (b(x)==b(y))return 0;
18 if (b(x)<b(y))return 0x3f3f3f3f;
19 return -0x3f3f3f3f;
20 }
21 return 1.0*(b(y)-b(x))/(k(x)-k(y));
22 }
23 void add(int x){
24 int k=e[x].y;
25 while ((sz[k]>1)&&(point(v[k][sz[k]-2],v[k][sz[k]-1])>point(v[k][sz[k]-1],x))){
26 v[k].erase(--v[k].end());
27 sz[k]--;
28 }
29 v[k].push_back(x);
30 sz[k]++;
31 }
32 int query(int x){
33 int k=e[x].x;
34 if (!sz[k])return 0x3f3f3f3f;
35 while ((sz[k]>1)&&(point(v[k][0],v[k][1])<e[x].p)){
36 v[k].erase(v[k].begin());
37 sz[k]--;
38 }
39 return k(v[k][0])*e[x].p+b(v[k][0]);
40 }
41 int main(){
42 freopen("route.in","r",stdin);
43 freopen("route.out","w",stdout);
44 scanf("%d%d%d%d%d",&n,&m,&A,&B,&C);
45 for(int i=1;i<=m;i++)scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].p,&e[i].q);
46 sort(e+1,e+m+1,cmp);
47 e[0].y=1;
48 s.insert(make_pair(0,0));
49 for(int i=1;i<=m;i++){
50 while ((s.size())&&((*s.begin()).first<=e[i].p)){
51 add((*s.begin()).second);
52 s.erase(s.begin());
53 }
54 dp[i]=query(i)+A*e[i].p*e[i].p+B*e[i].p+C;
55 s.insert(make_pair(e[i].q,i));
56 }
57 ans=0x3f3f3f3f;
58 for(int i=1;i<=m;i++)
59 if (e[i].y==n)ans=min(ans,dp[i]+e[i].q);
60 printf("%d",ans);
61 return 0;
62 }

[loj3156]回家路线的更多相关文章

  1. NOI2019 回家路线 DP

    「NOI2019」回家路线 链接 loj 思路 f[i][j]第i个点,时间为j,暴力转移 复杂度O(m*t),好像正解是斜率优化,出题人太不小心了233 代码 #include <bits/s ...

  2. [NOI2019]回家路线

    [NOI2019]回家路线 题目大意: 有\(n\)个站点,\(m\)趟车,每趟车在\(p_i\)时从\(x_i\)出发,\(q_i\)时到达\(y_i\). 若小猫共乘坐了\(k\)班列车,依次乘坐 ...

  3. P5468 [NOI2019]回家路线 斜率优化 dp

    LINK:回家路线 (文化课 oi 双爆炸 对 没学上的就是我.(我错了不该这么丧的. 不过还能苟住一段时间.当然是去打NOI了 这道题去年同步赛的时候做过.不过这里再次提醒自己要认真仔细的看题目 不 ...

  4. 【LOJ3156】「NOI2019」回家路线

    [题目链接] [点击打开链接] [题目概括] 现在有\(n\)个站点,\(m\)条火车路线,每一条货车路线都有一个起点站点.终点站点.开始时间和到站时间. 对于一直在起点\(1\)的人,终点是\(n\ ...

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

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

  6. 【题解】Luogu P5468 [NOI2019]回家路线

    原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...

  7. [NOI2019]回家路线(最短路,斜率优化)

    终于把这鬼玩意弄完了-- 为什么写的这么丑-- (顺便吐槽 routesea) 最短路的状态很显然:\(f[i]\) 表示从第 \(i\) 条线下来的最小代价. 首先明显要把那个式子拆开.直觉告诉我们 ...

  8. 【斜率优化】【P5468】 [NOI2019]回家路线

    Description 给定 \(n\) 点,这 \(n\) 个点由 \(m\) 班列车穿插连结.对于第 \(i\) 班列车,会在 \(p_i\) 时刻从 \(x_i\) 站点出发开向 \(y_i\) ...

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

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

随机推荐

  1. 【Docker】(9)---每天5分钟玩转 Docker 容器技术之镜像

    镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器.为什么我们要讨论镜像的内部结构? 如果只是使用镜像,当然不需要了解,直接通过 docker 命令下载和运行就可以了. 但如 ...

  2. The Data Way Vol.2 | 做个『单纯』的程序员还真不简单

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  3. 学习使用SignalR

    1.创建空白的控制台程序 2.添加两个NuGet包(Microsoft.AspNet.SignalR.SelfHost.Microsoft.Owin.Cors.Topshelf)Topshelf用于快 ...

  4. Vulnhub实战-DockHole_1靶机👻

    Vulnhub实战-DockHole_1靶机 靶机地址:https://www.vulnhub.com/entry/darkhole-1,724/ 1.描述 我们下载下来这个靶机然后在vmware中打 ...

  5. 264.丑数II

    题目 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例 1: 输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, ...

  6. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

  7. Java:并发笔记-01

    Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...

  8. InitSpatialMetaData()速度慢的问题

    解决方法:with sqlite3.connect(dbfile) as con: con.enable_load_extension(True) con.execute("SELECT l ...

  9. 主集天线和分集天线——4G天线技术

    主集天线和分集天线 分集接收技术是一项主要的抗衰落技术,可以大大提高多径衰落信道传输下的可靠性,在实际的移动通信系统中,移动台常常工作在城市建筑群或其他复杂的地理环境中,而且移动的速度和方向是任意的. ...

  10. 从零开始 DIY 智能家居 - 基于 ESP32 的智能语音合成播报模块

    目录 前言 硬件选择 代码解析 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 语音播报与设置流程 总结 前言 这里这么多设备,突然发现我做的好像都是传感器之类的居多好像 ...