题意

戳这里

吐槽

听同学说今年\(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$的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

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

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

  3. Light OJ 1031---Easy Game(区间DP)

    题目链接 http://lightoj.com/volume_showproblem.php?problem=1031 Description You are playing a two player ...

  4. HDU 5807 Keep In Touch DP

    Keep In Touch Problem Description   There are n cities numbered with successive integers from 1 to n ...

  5. 17996 Daily Cool Run (dp)

    时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: 不限定 Description Daily Cool Run is a popular gam ...

  6. hdu 1028 Ignatius and the Princess III 简单dp

    题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...

  7. BC.5200.Trees(dp)

    Trees  Accepts: 156  Submissions: 533  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/6 ...

  8. hdu 5115 区间dp ***

    题意:有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值. 枚举中间k作为最后杀死的 ...

  9. HDU 4258 Covered Walkway 斜率优化DP

    Covered Walkway Problem Description   Your university wants to build a new walkway, and they want at ...

随机推荐

  1. solr配置中文分词器——(十二)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqcAAAGzCAIAAACdKClDAAAgAElEQVR4nOydd5gUxdbGx5xASZKXLB

  2. Spring4笔记8--Spring与JDBC模板(IoC应用的例子)

    Spring 与 JDBC模板: 为了避免直接使用 JDBC 而带来的复杂且冗长的代码,Spring 提供了一个强有力的模板类---JdbcTemplate 来简化 JDBC 操作.并且,数据源 Da ...

  3. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  4. Python Challenge 第 5 关攻略:peak

    # -*- coding: utf-8 -*- # @Time : 2018/9/26 14:03 # @Author : cxa # @File : pickledemo.py # @Softwar ...

  5. C#基础学习之装箱,拆箱

    装箱,拆箱这两个的大条件是有继承关系. 装箱:值类型转换为引用类型 拆箱:引用类型转换为之类 但是要注意大条件. string (引用类型)  int(值类型)   这个转换因为没有继承关系,内存中没 ...

  6. strace使用详解(未研究)

    (一) strace 命令    用途:打印 STREAMS 跟踪消息. 语法:strace [ mid sid level ] ... 描述:没有参数的 strace 命令将所有的驱动程序和模块中的 ...

  7. 洛谷P2746校园网

    传送门啦 下面来看任务B.我们发现,图中只要存在入度为0的点和出度为0的点就永远不可能满足要求:" 不论我们给哪个学校发送新软件,它都会到达其余所有的学校 ".我们还发现,只要在入 ...

  8. Codeforces 734C Anton and Making Potions(枚举+二分)

    题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种 ...

  9. 课堂实验-模拟实现Sort

    课堂实验 模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的实现. 代码如下: /** * Created by Administrator on 2017/5/20. */ i ...

  10. Visual Studio 2017 发布 附带下载地址

    链接: https://pan.baidu.com/s/1kFjGwyj5HwabvmJKiyLF_g 提取码: 关注公众号[GitHubCN]回复获取    winform框架源码-Devexpre ...