luoguP5017 摆渡车
链接
点击跳转
题解
现在的普及组题质量还蛮高的
首先这题读完就想到是dpdpdp
fif_ifi表示在iii时刻发车,这之前出现的人等待的最小总时长是多少
转移就是fi=min(fj+t)f_i = min(f_j+t)fi=min(fj+t),ttt就是从j+1j+1j+1到iii这个时刻出现的人等待的总时长
然后发现当j<i−2∗mj<i-2*mj<i−2∗m时转移是重复的,因为这两次发车之间空出了完整的mmm时间,我为啥不补发一辆呢?
这样就有了一个O(m×max(ti))O(m\times max(t_i))O(m×max(ti))的做法
然后注意到nnn很小,那也就是说人出现的很稀疏
这个优化不太好想,注意一个问题,我的dpdpdp方程中ttt是两次发车之间的人等待的时长,那么如果两次发车之间没有人,ttt显然等于000,那么问题就迎刃而解了,我按时间从小到大dpdpdp,记录上一次出现的人在哪个时间,如果当前时间和那个时间的差大于2m2m2m,那么我的dpdpdp就变成了单纯的区间求最值,一个单调队列就搞定了
最终的复杂度O(nm+max(ti))O(nm+max(t_i))O(nm+max(ti))
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 4000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(_,__) for(_=1;_<=(__);_++)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{ll c, f(1);for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;for(;isdigit(c);c=getchar())x=x*10+c-0x30;return f*x;
}
int n, f[maxn], m, cnt[maxn], s[maxn];
int main()
{int i, j, t, last=-1;n=read(), m=read();rep(i,n)cnt[read()]++;rep(i,int(4e6))s[i]=s[i-1]+cnt[i];deque<int> q;for(i=0;i<m;i++){if(cnt[i])last=i;for(j=0;j<=i;j++)f[i]+=cnt[j]*(i-j);}for(i=m;i<=(int)4e6;i++){while(q.size() and f[q.back()]>f[i-m])q.pop_back(); q.push_back(i-m);if(cnt[i])last=i;if(i-last>=2*m and last>0){while(i-q.front()>=2*m)q.pop_front();f[i]=f[q.front()];continue;}f[i]=0x7fffffff;t=0;for(j=i-1;j>=0 and i-j<2*m;j--){if(i-j>=m)f[i]=min(f[i],f[j]+t);t+=cnt[j]*(i-j);}}int ans=0x7fffffff;for(i=last;i<=int(4e6);i++)ans=min(ans,f[i]);cout<<ans;return 0;
}
luoguP5017 摆渡车相关推荐
- 马斯克不仅承包NASA火箭发射,现在连火箭“摆渡车”都换成特斯拉了
白交 发自 凹非寺 量子位 报道 | 公众号 QbitAI 人类从地球到太空,交通工具快被马斯克承包完了. 如今,前往Space X火箭发射塔,摆渡车已改用特斯拉. 一辆刷上NASA标识的Model ...
- 摆渡车(noip2018 pj t3)
摆渡车(题目和测试右转 洛谷P5017) 做法:dp+各种优化(剪枝) 这道题考场上看了一脸懵逼...第一眼看这 tm 不是个一维dp吗...结果按着这个朦胧的思路,删删改改约莫0.5h,终于过了小样 ...
- 『摆渡车 斜率优化dp及总结』
摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...
- 【NOIP2018】摆渡车
[题意] 1.第i个同学在第t[i]分钟到达车站 2.摆渡车一次可以装下无数人 3.两次发车的间隔时间m分钟 求所有等车时间和的最小值 [解题] 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对 ...
- P5017 NOIP2018 普及组 摆渡车
P5017 NOIP2018 普及组 摆渡车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 显然要把人按照到达时间排序.然后考虑 dp. 设 \(f(i)\) 表示前 \(i\) ...
- [NOIP 2018 T3]摆渡车
摆渡车 题目描述 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti 分钟去等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发.把车上的同学送到人民大 ...
- 凭门票 成都露天音乐公园多条摆渡车线路免费坐
五一小长假期间,位于凤凰山的成都露天音乐公园将迎来"首秀","礼赞新中国70周年·致敬盛典暨成都卡路里运动音乐节"一系列活动将在这里举行.4月30日,记者从成都 ...
- [NOIP2018]摆渡车(c++)
题目描述 有n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送到人民大学.再回 ...
- 微信小程序之校园摆渡车系统
微信小程序之校园摆渡车系统 简介 本项目的设计初衷是为了解决在校一直等待校园摆渡车的情况,想通过这个软件实现司机可以实时看到等车人的位置,等车人也可以实时的叫车,并且看到司机位置,并且恰逢 orcl大 ...
最新文章
- JAVA线程池(ThreadPoolExecutor)源码分析
- 从 WordCount 到 MapReduce 计算模型
- c语言实现天气预报步骤,天气预报是怎么预测天气的?天气预报制定需要哪些步骤...
- Keras .ImageDataGenerator图像增强用法大全以及如何和模型结合起来(有代码)
- Shell——常用工具(cut、sed、awk、sort)
- PHP经验总结 - 开发技巧分享
- Android开发之RadioButton位于文字右边的显示方法
- 防止多次提交的几个比较
- eclipse中启动tomcat的项目路径
- 运营级IOS一键签名程序源码 支持app超级签名一键分发平台
- 最担心的事情还是发生了!三星折叠屏手机翻车:闪屏、黑屏、“脱皮”
- mysql性能优化学习_mysql学习——性能优化之sql优化
- wepe 装linux ubuntu,Ubuntu16.04下安装Wechat的实现方法
- All boundaries are conventions, waiting to be transcended.
- 开通5G网络服务三个月,中国广电交出了什么样的答卷?
- 需求文档(PRD文档)
- 百度网盘无需开会员也能享受高速下载通道
- 红巨星视频调色AE插件 Red Giant Magic Bullet Suite 16.0.0 WIN
- 新手学习selenium路线图(老司机亲手绘制)-学前篇(转上海悠悠)
- (一百五十一)Android P 真正创建sta iface的地方
热门文章
- CAD图形离散成数据点
- 一起来学大数据|整合SpringMVC与Mybatis,各司其职相得益彰
- pycharm2017.1专业版破解
- 解决上传图片自动旋转的问题以及对图片进行压缩上传
- Java main方法
- leetcode:剑指 Offer 63. 股票的最大利润【记录前缀最小和 or 无脑线段树】
- php 自动收货’_PHP实现电商订单自动确认收货redis队列
- Anderson《空气动力学基础》5th读书笔记 第4记——黏性流动入门
- 含论文基于JAVA零食销售商城【数据库设计、论文、源码、开题报告】
- android创建webview,Android Webview总结