普及组考斜率优化

考虑dpdpdp

fif_ifi​表示在iii时刻发车的最小等待时间

那么我们可以得到转移方程

fi=min⁡0≤j≤i−m{fj+(cnti−cntj)i−(sumi−sumj)}f_i=\min\limits_{0\leq j\leq i-m} \{f_j+(cnt_i-cnt_j)i-(sum_i-sum_j)\}fi​=0≤j≤i−mmin​{fj​+(cnti​−cntj​)i−(sumi​−sumj​)}

其中cnt,sumcnt,sumcnt,sum分别是学生个数和学生到达时间的前缀和

发现jjj的最优转移一定是在[i−2m,i−m][i-2m,i-m][i−2m,i−m]上的,这样复杂度可以变成O(tm)O(tm)O(tm)

但是众所周知CCF老爷机的速度

我们发现这个式子可以斜率优化,写成

fj+sumj=i×cntj−ci×i+si+fif_j+sum_j=i\times cnt_j-c_i\times i+s_i+f_ifj​+sumj​=i×cntj​−ci​×i+si​+fi​

其中y=fj+sumj,k=i,x=cntj,b=−ci×i+si+fiy=f_j+sum_j,k=i,x=cnt_j,b=-c_i\times i+s_i+f_iy=fj​+sumj​,k=i,x=cntj​,b=−ci​×i+si​+fi​

然后这道题就愉快的O(t)O(t)O(t)解决了!

#include <bits/stdc++.h>
using namespace std;# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)typedef long long ll;const int N=4e6+5;
const int mod=1e9;template<typename T> void read(T &x){x=0;int f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';x*=f;
}int n,m,top;
int a[N];
int cnt[N],sum[N];
int f[N];
int q[N],head,tail;
int ans=INT_MAX;int fz(int x,int y){return f[x]+sum[x]-f[y]-sum[y];
}int fm(int x,int y){return cnt[x]-cnt[y];
}int main()
{read(n),read(m);Rep(i,1,n)read(a[i]),sum[a[i]]+=a[i],cnt[a[i]]++;Rep(i,1,n)top=max(top,a[i]);Rep(i,1,top+m)sum[i]+=sum[i-1],cnt[i]+=cnt[i-1];head=1,tail=0;Rep(i,0,m-1)f[i]=cnt[i]*i-sum[i];q[++tail]=0;Rep(i,m,top+m){while(head<tail&&fz(q[head+1],q[head])<=1ll*i*fm(q[head+1],q[head]))head++;f[i]=f[q[head]]+(cnt[i]-cnt[q[head]])*i-(sum[i]-sum[q[head]]);while(head<tail&&1ll*fz(q[tail],1ll*q[tail-1])*fm(i-m+1,q[tail])>=1ll*fz(i-m+1,q[tail])*fm(q[tail],q[tail-1]))tail--;q[++tail]=i-m+1;}Rep(i,top,top+m)ans=min(ans,f[i]);printf("%d\n",ans);return 0;
}

[NOIp2018] 摆渡车相关推荐

  1. [NOIP2018]摆渡车(c++)

    题目描述 有n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送到人民大学.再回 ...

  2. 2018 NOIP 普及组

    文章目录 T1 标题统计 T1分析 T2 龙虎斗 T2分析 T3 摆渡车 T3分析 解法 I 解法 II T4 对称二叉树 T4分析 T1 标题统计 题目点击→计蒜客 [NOIP2018] 标题统计 ...

  3. P5017 NOIP2018 普及组 摆渡车

    P5017 NOIP2018 普及组 摆渡车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 显然要把人按照到达时间排序.然后考虑 dp. 设 \(f(i)\) 表示前 \(i\) ...

  4. 摆渡车(noip2018 pj t3)

    摆渡车(题目和测试右转 洛谷P5017) 做法:dp+各种优化(剪枝) 这道题考场上看了一脸懵逼...第一眼看这 tm 不是个一维dp吗...结果按着这个朦胧的思路,删删改改约莫0.5h,终于过了小样 ...

  5. 【NOIP2018】摆渡车

    [题意] 1.第i个同学在第t[i]分钟到达车站 2.摆渡车一次可以装下无数人 3.两次发车的间隔时间m分钟 求所有等车时间和的最小值 [解题] 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对 ...

  6. NOIP2018普及组复赛——T3摆渡车

    题目描述 有 n n n名同学要乘坐摆渡车从人大附中前往人民大学,第 i i i 位同学在第 t i t_i

  7. P5017 [NOIP2018 普及组] 摆渡车 题解

    题目传送门 题目描述 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送 ...

  8. NOIp2018普及组-摆渡车

    (作为一名已经离开了普及组的退役选手感到万分庆幸) 题目链接:https://www.luogu.org/problemnew/solution/P5017 1.感觉就是一个类似线性的以时间作为维度的 ...

  9. [NOIP2018 普及组] 摆渡车题解

    题目链接 题意 给出n名同学到达车站的时间,只有一辆摆渡车,来回需要mmm分钟,求将所有同学摆渡到终点,所有同学的最少等车时间之和. 抽象一下题意: 数轴:时间轴 点权值:此时刻等车的人数 区间右端点 ...

最新文章

  1. MongoDB存储基础教程
  2. jsoup的Elements类
  3. Elasticsearch整理笔记(三)
  4. python物理模拟_在Python游戏中模拟重力【Programming(Python)】
  5. macos下卸载软件
  6. 2021-2025年中国超本地服务行业市场供需与战略研究报告
  7. linux环境变量如何设置
  8. 全国计算机二级考试2008版教材,全国计算机等级考试教程:二级Visual FoxPro(2008年版)...
  9. 【从零开始学架构-李运华】03|架构设计的目的
  10. Convert excel format exception.You can try specifying the ‘excelType‘ yourself
  11. Jack Lin tools 3Dmax批渲染插件
  12. 假期无聊 就来试试用Python做一个智能识别 包教会哦 多图预警:配置Pyqt5超详细解说(designer.exe和pyuic.exe)以及项目:Python实现百度智能识别,识别各种实物
  13. Apostrophe not preceded错误
  14. 数据库:Redis数据库
  15. JAVA继承面积计算体积_java初学基础 使用继承 计算圆形周长、面积和圆柱体积...
  16. [日更-2019.4.8、4.9、4.12、4.13] cm-14.1 Android系统启动过程分析(一)-init进程的启动、rc脚本解析、zygote启动、属性服务...
  17. Win 8预览版将上市 首批应用名单出炉
  18. 这几天,聊到的最多的就是互通有无
  19. Python爬虫抓取股票信息
  20. 基于随机森林算法的糖尿病数据集回归

热门文章

  1. C# 语言 和西门子S7200 smart通信
  2. 豆瓣评分小程序Part-1
  3. python学习笔记二
  4. 从数字孪生到数字永生,元宇宙发展的“三阶段论”
  5. 《有趣的力学》读书笔记
  6. 向吃鸡外挂站开炮(三)——yzddMr6
  7. vue怎么实现跨域?
  8. Python图像识别,图片相似度计算!
  9. 华为方舟编译器和鸿蒙,终于来了,方舟编译后程序完美运行在鸿蒙上,脱离安卓就在眼前?...
  10. 蓝牙耳机怎么选?商城高性价比蓝牙耳机推荐,百款蓝牙耳机前五名