传送门


将乘客按照\(D_i\)从小到大排序并重新标号。对于服务站\(j\),如果\(S_j \mod T \in (D_i , D_{i+1})\),那么可以少接一些水,在保证司机有水喝的情况下让编号在\([x,i](x \in [1,i])\)的乘客下车(我们将这个区间称作这个服务区的下车区间),然后到达这个服务站接水。区间\([D_x , D_i]\)之间有服务区也没关系,只要在服务区不接水就可以了。

所以有DP:设\(f_i\)表示考虑了前\(i\)个乘客,最少花费的费用是多少。转移有:①\(f_i = f_{i-1} + \lfloor \frac{X - D_i}{T} \rfloor \times W\),表示第\(i\)个人一直坐到终点;②如果在\((D_i , D_{i+1})\)内有服务站,还有转移\(f_i = \min\limits_{0 \leq j < i} f_j + (i - j) \times W \times cnt + \sum\limits_{k = j + 1}^i C_k\),其中\(cnt\)表示的是\(j+1\)到\(i\)的乘客的最少饮水次数,也就是\(\min\limits_{S_k \mod T \in (D_i , D_{i+1})}\lfloor \frac{S_k}{T} \rfloor\)

对于一些乘客,如果我们已经确定了他们要下车,那么一定是越早下车越好,也就是说所有服务站的下车区间一定无交,所以上面②的转移是正确的。

把\(\sum\limits_{k = j + 1}^i C_k\)变成前缀和,就是一个可以斜率优化的式子,栈维护凸包即可。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define INF 1e18
//This code is written by Itst
using namespace std; #define int long long
inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define PII pair < int , int >
#define st first
#define nd second
const int MAXN = 2e5 + 3;
int N , M , X , W , T , top = 1;
int dp[MAXN] , dis[MAXN] , stk[MAXN];
struct machine{
int D , C;
bool operator <(const machine a)const{return D < a.D;}
}now[MAXN]; long double calc(PII A , PII B){
return 1.0 * (A.nd - B.nd) / (B.st - A.st);
} PII create(int x){return PII(-x * W , dp[x] - now[x].C);} bool chk(int a , int b , int c){
PII A = create(a) , B = create(b) , C = create(c);
return calc(A , B) > calc(A , C);
} int calc(PII a , int x){return a.st * x + a.nd;} int get(int X){
int L = 1 , R = top;
while(L < R){
int mid = (L + R) >> 1;
calc(create(stk[mid]) , X) > calc(create(stk[mid + 1]) , X) ? L = mid + 1 : R = mid;
}
return calc(create(stk[L]) , X);
} bool cmp(int a , int b){return a % T < b % T;} signed main(){
#ifndef ONLINE_JUDGE
freopen("eternity.in","r",stdin);
freopen("eternity.out","w",stdout);
#endif
X = read(); N = read(); M = read(); W = read(); T = read();
for(int i = 1 ; i <= N ; ++i)
dis[i] = read();
dis[++N] = X;
for(int i = 1 ; i <= M ; ++i){
now[i].D = read();
now[i].C = read();
}
sort(dis + 1 , dis + N + 1 , cmp);
sort(now + 1 , now + M + 1);
now[M + 1].D = T;
for(int i = 1 ; i <= M ; ++i)
now[i].C = now[i].C + now[i - 1].C;
memset(dp , 0x3f , sizeof(dp));
dp[0] = 0; int pos = 1;
while(pos <= N && dis[pos] % T <= now[1].D) ++pos;
for(int i = 1 ; i <= M ; ++i){
int Min = INF;
while(pos <= N && dis[pos] % T < now[i + 1].D)
Min = min(Min , dis[pos++] / T);
dp[i] = dp[i - 1] + ((X - now[i].D) / T + 1) * W;
if(Min != INF)
dp[i] = min(dp[i] , get(Min) + Min * W * i + now[i].C);
while(top > 1 && chk(stk[top - 1] , stk[top] , i))
--top;
stk[++top] = i;
}
cout << dp[M] + (X / T + 1) * W;
return 0;
}

LOJ2396 JOISC2017 长途巴士 斜率优化的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  2. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  3. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  4. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  5. 【BZOJ2442】 [Usaco2011 Open]修剪草坪 斜率优化DP

    第一次斜率优化. 大致有两种思路: 1.f[i]表示第i个不选的最优情况(最小损失和)f[i]=f[j]+e[i] 显然n^2会T,但是可以发现f的移动情况可以用之前单调队列优化,就优化成O(n)的了 ...

  6. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  7. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  8. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  9. [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)

    Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...

随机推荐

  1. 深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布

    本文由云+社区发表 作者:腾讯WeTest 原文链接:https://wetest.qq.com/lab/view/437.html 对于游戏行业的不少人来说,2018年是一个多事之秋. 放眼大局,游 ...

  2. 如何定制Linux外围文件系统?

    本文由云+社区发表 作者:我是乖宝宝哦 一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版.为了掌握Linux操作系统的使用,了解 Lin ...

  3. 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的source文件. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就是 ...

  4. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  5. C# 实现对PPT文档加密、解密以及重置密码的操作

    工作中我们会使用到各种各样的文档,其中,PPT起着不可或缺的作用.一份PPT文档里可能包含重要商业计划.企业运营资料或者公司管理资料等.因此,在竞争环境里,企业重要资料的保密工作就显得尤为重要,而对于 ...

  6. Java开发笔记(七十四)内存溢出的两种错误

    前面介绍的几种异常,其实都存在这样那样的逻辑问题,属于程序员的编码手误.还有一大类系统错误,表面上看不出什么问题,但是程序仍然运行不下去,兹举二例说明.第一个例子且看下列的测试代码: // 测试内存溢 ...

  7. mysql修改连接数

    方法一:   进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起M ...

  8. 零基础学Python--------第8章 模块

    第8章 模块 8.1 模块概述 模块的英文是Modules,可以认为是一盒(箱)主题积木,通过它可以拼出某一个主题的东西.这与第6章介绍的函数不同,一个函数相当于一块积木,而一个模块中可以包括很多函数 ...

  9. charles抓包出现乱码 SSL Proxying not enabled for this host:enable in Proxy Setting,SSL locations

    1.情景:抓包的域名下 全部是unknown,右侧出现了乱码 2.查看unknown的notes里面:SSL Proxying not enabled for this host:enable in ...

  10. Vs2017 xaramin mac build agent部署后记

                    换了四种黑苹果,最终成功了                 步骤: 1.升级vs2017, 2.安装XCODE 8.3 3.安装vs2017 for mac 企业版 4 ...