【题解】Cats Transport (斜率优化+单调队列)
【题解】Cats Transport (斜率优化+单调队列)
| # | When | Who | Problem | Lang | Verdict | Time | Memory |
|---|---|---|---|---|---|---|---|
| 55331572 | Jun/09/2019 19:18UTC+8 | Winlere | D - Cats Transport | GNU C++11 | Accepted | 405 ms | 84200 KB |
思考的过程很艰难,想清楚之后就不难做了。记录一下思路过程。
| 时间 | 事件 |
|---|---|
| 14:00 | 开始审题 |
| 14:15 | 手玩样例 |
| 14:30 | Observe \(\times 1\):一个喂养员喂连续的一片 |
| 14:50 | Observe\(\times2\):一个喂养员喂的连续的一片一定是按照\(t(i)-dis(1,h_i)\)的升序最优 |
| 15:00 | Brute Force\(\times 1\): \(O(n^2)\)DP,\(dp(i,j)\)考虑了\(i\)个喂养员,带回前\(j\)只猫(按照\(t(i)-dis(1,h_i)\)排序) |
| 15:30 | Debug \(\times 1\): \(t(i)-dis(1,h_i)\)不需要对\(0\)取\(max\) |
| 16:30 | Solution\(\times 1\) 单调队列 |
| 16:50 | Solution\(\times2\) 斜率优化+单调队列 |
| 吃饭 | 差点被阿 |
| 19:18 | Accepted |
想的时间占了很多,幸运的是一开始的\(O(n^2)\)DP的方向是对的,一个小时写出暴力还是很赚的。就是后面想什么单调队列,应该可以直接想到斜率优化的,\(n^2\)转\(n \log n\)太常见了。
有两个Observe比较显然就不证明了。\(t_i-dis(1,i)\)可以代表的含义是喂养员最早出来的时刻。
\(O(n^2)\)的转移:
\\
sum(i)=\Sigma_{j=1}^it_j-dis(1,j)
\]
拆开\(j,k\)直接变成一个斜率优化的套路式。
\(x_k=k,y_k=dp(i-1,k)+sum(k)\)
原式变为:
\]
查询一个截距最小值。好像要单调队列维护。查到哪个\(k\)转移套到原式就好了。
不过这里复杂度貌似\(O(n)(k\le 100)\)
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long ll;
inline ll qr(){
register ll ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1e5+5;
int n,m,p;
int dis[maxn];
ll sumd[maxn];
ll sumdata[maxn];
ll x[maxn];
ll y[maxn];
ll dp[101][maxn];
struct NODE{
int pos,time;
ll limit;
NODE(){limit=pos=time=0;}
inline bool operator <(const NODE&a)const{return limit<a.limit;}
inline void scan(){
pos=qr();time=qr();
limit=time-sumd[pos];
}
}data[maxn];
typedef deque<int>::iterator it;
deque < int > q;
int main(){
n=qr();m=qr();p=qr();
for(register int t=2;t<=n;++t)
sumd[t]=(dis[t]=qr())+sumd[t-1];
for(register int t=1;t<=m;++t)
data[t].scan();
sort(data+1,data+m+1);
for(register int t=1;t<=m;++t) sumdata[t]=data[t].limit+sumdata[t-1];
memset(dp,5,sizeof dp);
dp[0][0]=0;
it ita;
for(register int i=0;i<=m;++i)
x[i]=i;
for(register int t=1;t<=p;++t){
for(register int i=0;i<=m;++i){
dp[t][i]=dp[t-1][i];
y[i]=dp[t-1][i]+sumdata[i];
}
q.clear();
for(register int i=1;i<=m;++i){
q.push_back(i-1);
ita=q.begin();
while(q.size()>1&&y[*(ita+1)]-y[*ita]<=1ll*data[i].limit*((*(ita+1))-(*ita))) q.pop_front(),ita=q.begin();
register int j=q.front();
dp[t][i]=min(dp[t][i],dp[t-1][j]+1ll*(i-j)*data[i].limit-(sumdata[i]-sumdata[j]));
ita=q.end()-1;
while(q.size()>1&&(y[*ita]-1ll*y[*(ita-1)])*(i-(*ita))>=1ll*(y[i]-y[*ita])*((*ita)-(*(ita-1)))) q.pop_back(),ita=q.end()-1;;
}
}
cout<<dp[p][m]<<endl;
return 0;
}
【题解】Cats Transport (斜率优化+单调队列)的更多相关文章
- CF311B Cats Transport 斜率优化DP
题面:CF311B Cats Transport 题解: 首先我们观察到山与距离其实是没有什么用的,因为对于任意一只猫,我们都可以直接算出如果有一个人要恰好接走它,需要在哪一时刻出发,我们设第i只猫对 ...
- BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)
题目链接 斜率优化 不说了 网上很多 这的比较详细->Click Here or Here //1700kb 60ms #include<cstdio> #include<cc ...
- Codeforces 311B Cats Transport 斜率优化dp
Cats Transport 出发时间居然能是负的,我服了... 卡了我十几次, 我一直以为斜率优化写搓了. 我们能得出dp方程式 dp[ i ][ j ] = min(dp[ k ][ j - 1 ...
- [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- CF331B Cats Transport[斜率优化dp+贪心]
luogu翻译 一些山距离起点有距离且不同,m只猫要到不同的山上去玩ti时间,有p个铲屎官人要去把所有猫接走,步行速度为1单位每秒,从1走到N座山不停下,必须在猫玩完后才可以把他带走.可以提前出发.问 ...
- CodeForces 311 B Cats Transport 斜率优化DP
题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...
- $CF311B\ Cats\ Transport$ 斜率优化
AcWing Description Sol 设f[i][j]表示前i个饲养员接走前j只猫咪的最小等待时间. 要接到j猫咪,饲养员的最早出发时间是可求的,设为d: $ d[j]=Tj-\sum_{k= ...
- LA-4726 (斜率优化+单调队列)
题意: 给定一个01序列,选一个长度至少为L 的连续子序列使其平均值最大;输出这个子序列的起点和终点;如果有多个答案,输出长度最小的,还有多个就输出第一个编号最小的; 思路: 用sum[i]表示[1, ...
- 题解-Cats Transport
题解-Cats Transport Cats Transport 有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官.第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_ ...
随机推荐
- Java中final和static关键字总结
1.final: final关键字可用于类.方法.变量前. final修饰的类不可被继承,例如java.lang.Math就是一个 final类,不可被继承. final修饰变量,在显示初始化后不可改 ...
- 这算是CSS的bug吗?
移动端web开发越来越火,同时移动端适配也是一个很让人头疼的事情,你不能让一个同样大小的元素在不同的设备上都显示一样大小.(iphone6和iphone4下大小肯定是应该不一样的,否则用户体验很差) ...
- Mac outlook设置自动回复
outlook是公司必不可少的软件, 在mac下开发,当然用的是mac版的outlook,今天介绍一下如何设置mac下outlook的自动回复. 有两种方式的帐号,一种是Exchange accoun ...
- 缠中说禅股票交易系统图解 z
缠中说禅股票交易系统图解 2010-03-23 10:51 (王纯阳)缠论祖师的经典语录 1. 就在买点买,卖点卖:当然,买点并不一定是一个点,一个价位,级别越大的,可以容忍的区间越大. 2. 你要经 ...
- VS2010 MFC中 使用CListCtrl的排序功能
list 控件是creat的,不是拖在对话框上的.想使用CListCtrl的排序功能却犯了愁~~~ 还好找到方法,如下: .h文件里:afx_msg void OnLvnColumnclickList ...
- 负样本采样及bias校准、ctr平滑
参考:https://zhuanlan.zhihu.com/p/31529643 在CTR预估中,负样本采样是一种常见的特征工程方法.一般CTR预估的原始正负样本比可能达到1:1000~1:10000 ...
- Mongodb性能调优
摘要 1. Mongodb 适用场景简介 2. Mongodb 性能监控与分析 3. Mongodb 性能优化建议 关于Mongodb的几个大事件 1.根据美国数据库知识大全官网发布的DB热度排行,M ...
- 【小程序】微信小程序开发实践
帐号相关流程 注册范围 企业 政府 媒体 其他组织 换句话讲就是不让个人开发者注册. :) 填写企业信息 不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的. 填写公司机构信 ...
- Win8 恢复传统启动菜单 for 多系统
如果你安装了Win7和Win8,启动的时候得先启动到Win8然后再启动到Win7,很怀念原来的启动选择器,这里给你方法了~ 当前系统是Win8的输入 bcdedit /set {current} bo ...
- 对datatable进行linq过滤
实例: DataTable data = new DataTable(); data.Columns.Add("schoolid", Type.GetType("Syst ...