LuoguP5017 摆渡车 $dp$
题意
吐槽
听同学说今年\(pjT3\)很难,于是就去看了下。
一眼斜率优化...为什么\(n,m\)这么小啊...
感觉这题出的还是不错的。
Solution
首先我们先转化一波题意:给出数轴上\(n\)个点,让你选择若干个两两距离大于等于\(m\)的点,使得每个点到右边第一个你选的点的距离和最小。
大力\(dp\),发现可以斜率优化。
\(pj\)会考斜率优化?
冷静一波,显然每个点的决策肯定在\([i-m*2,i-m]\)之间...
所以好像直接\(O(max(t_i)*m)\)转移常数小并不会\(T\)?
至少我\(Luogu\)数据过了...
#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,u) for (register int i=first[u];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0;int ch=getchar(),f=1;
while (!isdigit(ch)&&(ch!='-')) ch=getchar();
if (ch=='-'){f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int N = 1010, maxn = 5000110;
int n,m,Max,a[N],sum[maxn],Sum[maxn],dp[maxn];
bool vis[maxn];
inline void solve(){
For(i,0,Max){
dp[i]=Sum[i]*i-sum[i];
For(j,max(0,i-2*m),i-m){
int cnt=Sum[i]-Sum[j];
dp[i]=min(dp[i],dp[j]+cnt*i-sum[i]+sum[j]);
}
}
int ans=1e9;
For(i,Max-m,Max) ans=min(ans,dp[i]);
printf("%d",ans);
}
int main(){
n=read(),m=read();
For(i,1,n) a[i]=read(),Max=max(Max,a[i]),Sum[a[i]]++,sum[a[i]]+=a[i];
Max+=m;
For(i,1,Max) sum[i]+=sum[i-1],Sum[i]+=Sum[i-1];
solve();
}
再冷静一波...好像有很多状态是没用的?
如果一个点前面的\(m\)个点中都没有给出的点那么\(dp_i=dp_{i-m}\)...
然后算下复杂度...好像是\(O(nm+max(t_i))\)
#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,u) for (register int i=first[u];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0;int ch=getchar(),f=1;
while (!isdigit(ch)&&(ch!='-')) ch=getchar();
if (ch=='-'){f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int N = 1010, maxn = 5000110;
int n,m,Max,a[N],sum[maxn],Sum[maxn],dp[maxn];
inline void solve(){
For(i,0,Max){
dp[i]=Sum[i]*i-sum[i];
if (i>m&&Sum[i]-Sum[i-m]==0){dp[i]=dp[i-m];continue;}
For(j,max(0,i-2*m),i-m){
int cnt=Sum[i]-Sum[j];
dp[i]=min(dp[i],dp[j]+cnt*i-sum[i]+sum[j]);
}
}
int ans=1e9;
For(i,Max-m,Max) ans=min(ans,dp[i]);
printf("%d",ans);
}
int main(){
n=read(),m=read();
For(i,1,n) a[i]=read(),Max=max(Max,a[i]),Sum[a[i]]++,sum[a[i]]+=a[i];
Max+=m;
For(i,1,Max) sum[i]+=sum[i-1],Sum[i]+=Sum[i-1];
solve();
}
口胡
不难发现最后有用的点数是\(nm\)...
我们把这\(nm\)个点抠出来,基排一下,然后直接斜率优化\(dp\)应该能做到优秀的\(O(nm)\)的复杂度。
给我把nm开到1000w,ti开到1e9
\(upd:\)我第二个复杂度好像算错了...应该是\(O(nm^2+max(t_i))\)
LuoguP5017 摆渡车 $dp$的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- Light OJ 1031---Easy Game(区间DP)
题目链接 http://lightoj.com/volume_showproblem.php?problem=1031 Description You are playing a two player ...
- HDU 5807 Keep In Touch DP
Keep In Touch Problem Description There are n cities numbered with successive integers from 1 to n ...
- 17996 Daily Cool Run (dp)
时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description Daily Cool Run is a popular gam ...
- hdu 1028 Ignatius and the Princess III 简单dp
题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...
- BC.5200.Trees(dp)
Trees Accepts: 156 Submissions: 533 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/6 ...
- hdu 5115 区间dp ***
题意:有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值. 枚举中间k作为最后杀死的 ...
- HDU 4258 Covered Walkway 斜率优化DP
Covered Walkway Problem Description Your university wants to build a new walkway, and they want at ...
随机推荐
- CSS权重的问题
important > 内联 > ID > 类 > 标签 | 伪类 | 属性选择 > 伪对象 > 继承 > 通配符 1.行内样式,指的是html文档中定义的s ...
- linux通配符,grep和 egrep区别
其实主要是正则表达式中的一些特殊语法.在网上找的几篇文章,截取相关部分贴在了下面,方便以后翻阅. 参考:http://hi.baidu.com/sei_zhouyu/item/c18e1a950d2e ...
- python字典解析
import json # coding: utf-8 from functools import singledispatch from collections import abc import ...
- Javascript中的Callback方法浅析
什么是callback? 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数 ...
- http请求中的中文乱码问题
通过浏览器访问服务器页面和资源时,不可避免地要传送中文字串,如果客户机与服务器不能用同一码表解析字串,肯定会出现各种各样的乱码问题.我总结了几个乱码场景及解决办法,如下 1.服务器上的中文字串被客户端 ...
- 排序算法——Shell排序
二.Shell排序 Shell排序也叫“缩减增量排序”(disminishing increment sort),基于插入排序进行. Shell建议的序列是一种常用但不理想的增量序列:1,...,N/ ...
- CF529B 【Group Photo 2 (online mirror version)】
贪心枚举最后方案中最大的h,设为maxh若某个人i的wi与hi均大于maxh,则此方案不可行若某个人恰有一个属性大于maxh,则可确定他是否换属性剩下的人按wi-hi从大到小排序后贪心选择O(nlog ...
- 数据库中INFORMATION_SCHEMA的说明及使用
第一个查询看看库里有多少个表,表名等select * from INFORMATION_SCHEMA.TABLES information_schema这张数据表保存了MySQL服务器所有数据库的信息 ...
- 《精通Python设计模式》学习之原型模式
暂时在工作中,还没有用到呢~~~ 以后要留意一下,主要用于复制对象副本, 然后又有自定义属性的地方. import copy from collections import OrderedDict c ...
- 基于范围的for循环
语法: for ( for-range-declaration : expression ) statement 注意一般用auto表达类型.不需要修改时常用引用类型 例子: // range-bas ...