P5468 [NOI2019]回家路线 斜率优化 dp
LINK:回家路线
(文化课 oi 双爆炸 对 没学上的就是我。(我错了不该这么丧的.
不过还能苟住一段时间。当然是去打NOI了
这道题去年同步赛的时候做过。不过这里再次提醒自己要认真仔细的看题目 不要理解错题目的意思 导致测大样例的时候才发现自己的漏洞。导致时间上的浪费。
题目的本身还是极好的 容易得到一个\(m^2\)的dp做法. 进一步的可以得到一个\(mq\)的做法。由于数据过水 所以这样做就能过了。
(当然不会告诉你去年我写了一个nqlog的做法水过去了
考虑优化 还是对m这个东西进行dp 对序列dp很难受 状态数量至少是nq的。
观察贡献的式子 容易发现是斜率优化的标准式子 考虑对于端点y那些决策进行斜率优化。
需要考虑清楚几个问题:对于横坐标要从小到大加。所以需要排序 考虑对于贡献 排序后斜率和对于贡献的i都是递增的 这就可以很方便的使用单调队列维护了。
斜率优化要处理的最重要的一个细节是斜率不存在问题 特判或者强行删点 我使用的是后者。
时间复杂度为mlogm 瓶颈在于排序。
可以利用桶排序优化到线性 不过这样常数也很大没什么必要...
也可用通过luogu的加强版。
//#include<bits/stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
#include<string>
#include<utility>
#include<queue>
#include<vector>
#include<algorithm>
#include<deque>
#include<stack>
#include<list>
#include<bitset>
#include<set>
#include<map>
#define INF 1000000000000000000ll
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i<n;++i)
#define db double
#define get(x) x=read()
#define put(x) printf("%d\n",x)
#define pb push_back
#define ll long long
#define db double
#define putl(x) printf("%lld\n",x)
using namespace std;
char *fs,*ft,buf[1<<15];
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
int x=0,f=1;char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=1000010,maxn=100010;
int n,m;ll A,B,C,D;
int a[MAXN],L[maxn],R[maxn];
ll f[MAXN],v[MAXN];
struct wy{int x,y,p,q;}t[MAXN];
inline int cmp(wy a,wy b){return a.p<b.p;}
inline int cmp1(int a,int b){return t[a].q<t[b].q;}
vector<int>g[maxn];
inline db slope(int a,int b)
{
return (db)(v[a]-v[b])/(db)(t[a].q-t[b].q);
}
inline void insert(int x)
{
int p=t[x].y;v[x]=f[x]-B*t[x].q+A*t[x].q*t[x].q;
//加入g[p].
if(L[p]<=R[p])
{
if(t[g[p][R[p]]].q==t[x].q)
{
if(v[g[p][R[p]]]<v[x])return;
g[p].pop_back();--R[p];
}
}
while(L[p]<R[p]&&slope(g[p][R[p]],g[p][R[p]-1])>=slope(x,g[p][R[p]]))--R[p],g[p].pop_back();
g[p].pb(x);++R[p];
}
inline ll calc(int x){return x*A*x+B*x+C;}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(A);get(B);get(C);
rep(1,m,i)
{
int get(x),get(y);
int get(p),get(q);
t[i]=(wy){x,y,p,q};a[i]=i;
}
rep(1,n,i)L[i]=0,R[i]=-1;
sort(t+1,t+1+m,cmp);
sort(a+1,a+1+m,cmp1);
int flag=1;ll ans=INF;
rep(1,m,i)
{
while(flag<=m&&t[a[flag]].q<=t[i].p)
{
if(f[a[flag]]!=-1)insert(a[flag]);
++flag;
}
int p=t[i].x;f[i]=-1;
if(t[i].x==1)f[i]=calc(t[i].p);
while(L[p]<R[p]&&slope(g[p][L[p]+1],g[p][L[p]])<=2*A*t[i].p)++L[p];
if(L[p]<=R[p])f[i]=calc(t[i].p-t[g[p][L[p]]].q)+f[g[p][L[p]]];
if(f[i]!=-1&&t[i].y==n)ans=min(ans,f[i]+t[i].q);
}
putl(ans);
return 0;
}
P5468 [NOI2019]回家路线 斜率优化 dp的更多相关文章
- Luogu P5468 [NOI2019]回家路线 (斜率优化、DP)
题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...
- 【题解】Luogu P5468 [NOI2019]回家路线
原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...
- P5468 [NOI2019]回家路线
传送门 看题目一眼斜率优化,然后写半天调不出来 结果错误的 $dfs$ 有 $95$ 分?暴力 $SPFA$ 就 $AC$ 了? 讲讲正解: 显然是斜率优化的式子: 先不考虑 $q_{s_k}$ 的贡 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...
- [BZOJ3156]防御准备(斜率优化DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP
- 【BZOJ-1096】仓库建设 斜率优化DP
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3719 Solved: 1633[Submit][Stat ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- BZOJ 3156: 防御准备 斜率优化DP
3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...
随机推荐
- 实战SpringCloud通用请求字段拦截处理
背景 以SpringCloud构建的微服务系统为例,使用前后端分离的架构,每个系统都会提供一些通用的请求参数,例如移动端的系统版本信息.IMEI信息,Web端的IP信息,浏览器版本信息等,这些参数可能 ...
- java语法学习
// 单行注释 /* 多行注释 */ /** JavaDoc(Java文档)注释是这样的.可以用来描述类和类的属性. */ // 导入 java.util中的 ArrayList 类 import j ...
- 在Linux上部署jmeter
一.服务器安装jmeter 1.将安装文件上传到Linux服务器 通过xshell文件上传工具,将文件 “apache-jmeter-5.1.1.tgz”上传 2.在服务器解压缩“apache-jme ...
- Linux下diff命令用法详解
大家好,我是良许. 我们在平时工作的时候,经常要知道两个文件之间,以及同个文件不同版本之间有何异同点.在 Windows 下,有 beyond compare 这个好用的工具,而在 Linux 下,也 ...
- numpy基础用法学习
numpy get started 导入numpy库,并查看numpy版本 import numpy as np np.__version__ '1.14.0' 一.创建ndarray 1. 使用np ...
- 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!
写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...
- Visual SVN Server+TortoiseSVN进行源代码管理
安装VisualSVN Server 安装完之后,可配置SVN Server的IP地址,右键下图红色部分,选择属性,然后可配置ServeName和IP Address 之后可以创建用户.用户组和项目库 ...
- ADB-常见命令使用详解
ADB命令使用详解 ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 1.连接android设置adb connect 设备名例如:adb con ...
- vue : 无法加载文件 C:\Users\ui61895076\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
说白了就是这个编辑器不能用罢了 执行以下代码 1.鼠标右击以管理员身份运行vscode; 2. 执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的; 3. 执行: ...
- two types of friend
两类朋友 第一类,普通朋友,并不能分享一些隐私的感情,只能说一些事情,有一些只是认识的人或者虽然认识很多年但是也只能是这样的! 第二类,关心你,可以交流感清,明显更加亲密一点. 不要对第一类朋友说第二 ...