题意:

m只猫,p个人
n座山,第i座山和第i-1座山的距离为d[i],人在山1位置.
第i只猫去山h[i]玩,玩到t[i]结束,然后原地等候.
人需要走到h[i]并带走猫,一个人可以同时带无限只猫.
最小化猫的等待时间之和,等待时间指等人的时间.
1<=n,m<=1e5
1<=p<=100

解法:

设x[i]时刻出发恰好可以接到猫id[i][j]表示前i个人,带走j只猫的最小代价d[i][j]=min{d[i−1][k]+cost[k+1][j]}cost[k+1][j]=sumx[j]−a[t],t=[k+1,j]设pre[]为x[]前缀和cost[k+1][j]=x[j]∗(j−k)−(pre[j]−pre[k])d[i][j]=min{d[i−1][k]+x[j]∗(j−k)−(pre[j]−pre[k])}d[i][j]=d[i−1][k]+x[j]∗j−x[j]∗k−pre[j]+pre[k]d[i−1][k]+pre[k]=x[j]∗k+(d[i][j]−x[j]∗j+pre[j])Y=d[i−1][k]+pre[k]K=x[j]X=kB=d[i][j]−x[j]∗j+pre[j]X和K是递增的,可以斜率优化(ps:Y也是递增的)单调栈维护点(X,Y)的凸包即可设x[i]时刻出发恰好可以接到猫i\\ d[i][j]表示前i个人,带走j只猫的最小代价\\ d[i][j]=min\{d[i-1][k]+cost[k+1][j]\}\\ cost[k+1][j]=sum{x[j]-a[t]},t=[k+1,j]\\ 设pre[]为x[]前缀和\\ cost[k+1][j]=x[j]*(j-k)-(pre[j]-pre[k])\\ d[i][j]=min\{d[i-1][k]+x[j]*(j-k)-(pre[j]-pre[k])\}\\ d[i][j]=d[i-1][k]+x[j]*j-x[j]*k-pre[j]+pre[k]\\ d[i-1][k]+pre[k]=x[j]*k+(d[i][j]-x[j]*j+pre[j])\\ Y=d[i-1][k]+pre[k]\\ K=x[j]\\ X=k\\ B=d[i][j]-x[j]*j+pre[j]\\ X和K是递增的,可以斜率优化(ps:Y也是递增的)\\ 单调栈维护点(X,Y)的凸包即可设x[i]时刻出发恰好可以接到猫id[i][j]表示前i个人,带走j只猫的最小代价d[i][j]=min{d[i−1][k]+cost[k+1][j]}cost[k+1][j]=sumx[j]−a[t],t=[k+1,j]设pre[]为x[]前缀和cost[k+1][j]=x[j]∗(j−k)−(pre[j]−pre[k])d[i][j]=min{d[i−1][k]+x[j]∗(j−k)−(pre[j]−pre[k])}d[i][j]=d[i−1][k]+x[j]∗j−x[j]∗k−pre[j]+pre[k]d[i−1][k]+pre[k]=x[j]∗k+(d[i][j]−x[j]∗j+pre[j])Y=d[i−1][k]+pre[k]K=x[j]X=kB=d[i][j]−x[j]∗j+pre[j]X和K是递增的,可以斜率优化(ps:Y也是递增的)单调栈维护点(X,Y)的凸包即可

code:

#include<bits/stdc++.h>
// #define SYNC_OFF
#define int long long
#define ll long long
#define ull unsigned long long
//fast-coding
#define ST(x) x.begin()
#define ED(x) x.end()
#define RST(x) x.rbegin()
#define RED(x) x.end()
#define CL(x) x.clear();
#define all(a,n) a+1,a+1+n
#define ff(i,n) for(ll i=1;i<=n;i++)
#define rff(i,n) for(ll i=n;i>=1;i--)
#define fff(i,n) for(ll i=0;i<n;i++)
#define rfff(i,n) for(ll i=n-1;i>=0;i--)
#define SC(x) scanf("%s",x)
#define SL(x) strlen(x)
#define pss(a) push_back(a)
#define ps(a) push(a)
#define SZ(x) (int)x.size()
#define pee puts("");
#define eee putchar(' ');
#define re readdd()
#define pr(a) printtt(a)
int readdd(){int x=0,f=1;char c=getchar();//
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return f*x;}
void printtt(int x){if(x<0)putchar('-'),x=-x;//
if(x>=10)printtt(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}//
int ppow(int a,int b,int mod){a%=mod;//
int ans=1%mod;while(b){if(b&1)ans=(long long)ans*a%mod;
a=(long long)a*a%mod;b>>=1;}return ans;}
bool addd(int a,int b){return a>b;}
int lowbit(int x){return x&-x;}
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
bool isdigit(char c){return c>='0'&&c<='9';}
bool Isprime(int x){for(int i=2;i*i<=x;i++)if(x%i==0)return 0;return 1;
}
void ac(int x){if(x)puts("YES");else puts("NO");}
//short_type
#define VE vector<int>
#define PI pair<int,int>
//
using namespace std;
// const int mod=998244353;
const int mod=1e9+7;
const int maxm=2e6+5;
int f[111][111111];
int que[maxm];
int pre[maxm];
int d[maxm];
int h[maxm];
int t[maxm];
int x[maxm];
int n,m,p;
double cal(int pos,int i,int j){//点(k,d[i-1][k]+pre[k])return ((f[pos][i]+pre[i])-(f[pos][j]+pre[j]))*1.0/(i-j);
}
void solve(){n=re,m=re,p=re;for(int i=2;i<=n;i++)d[i]=re;for(int i=1;i<=m;i++)h[i]=re,t[i]=re;for(int i=1;i<=n;i++)d[i]+=d[i-1];//[1,i]的距离for(int i=1;i<=m;i++){//x[i]时刻出发恰好可以接到猫ix[i]=t[i]-d[h[i]];//x[i]+d[i]=t[i],x[i]=t[i]-d[i].}sort(x+1,x+1+m);for(int i=1;i<=m;i++){pre[i]=pre[i-1]+x[i];}//dpfor(int j=1;j<=m;j++){f[1][j]=x[j]*j-pre[j];}for(int i=2;i<=p;i++){int h=0,t=-1;que[++t]=0;for(int j=1;j<=m;j++){//队头去掉劣解while(h<t&&cal(i-1,que[h],que[h+1])<=x[j])h++;//dpint k=que[h];f[i][j]=f[i-1][k]+x[j]*(j-k)-(pre[j]-pre[k]);//队尾插入jwhile(h<t&&cal(i-1,j,que[t])<cal(i-1,que[t],que[t-1]))t--;que[++t]=j;}}//int ans=f[1][m];for(int i=1;i<=p;i++){ans=min(ans,f[i][m]);}pr(ans);pee;
}
void Main(){// #define MULTI_CASE#ifdef MULTI_CASEint T;cin>>T;while(T--)#endifsolve();
}
void Init(){#ifdef SYNC_OFFios::sync_with_stdio(0);cin.tie(0);#endif#ifndef ONLINE_JUDGEfreopen("../in.txt","r",stdin);freopen("../out.txt","w",stdout);#endif
}
signed main(){Init();Main();return 0;
}

Codeforces311 B. Cats Transport(斜率优化dp)相关推荐

  1. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  2. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  3. 【总结】斜率优化DP

    于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...

  4. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  5. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  6. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  7. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  8. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  9. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  10. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

最新文章

  1. 香港计算机本科专业,中国香港计算机本科专业包含哪些呢?
  2. cadence一些术语
  3. Solr debugQuery使用体会
  4. hi3559 h264
  5. AI理论知识基础(20)-线性变换(2),转换矩阵,相似矩阵,坐标向量
  6. 【ARM】数据操作指令(上)
  7. C++ primer 第14章 操作重载与类型转换
  8. nagios安装配置pnp4nagios-0.6.6
  9. spring boot配置虚拟路径(替代docBase配置)访问本地图片
  10. Windows下使用VS2008+CUDA3.0开发的详细配置 (Setup CUDA 3.0 on VS2008 in Windows)
  11. 塞班手机刷linux,向 诺基亚 塞班手机中 批量导入 通讯录(csplit iconv)
  12. 1、AD创建模板和导入
  13. 1040 实数的打印
  14. 统计学理论—假设检验
  15. 移动手机用户目录下的证书至根目录下
  16. 《神秘的程序员们》年度抽奖活动 开奖了
  17. 键盘定位板图纸_聊聊机械键盘的结构。
  18. 数据清洗(一)-----------重复数据处理
  19. mysql前台启动linux,mysql 在linux下的启动
  20. ​ 斯科特·马特森​与MIMO发明者谈话节选

热门文章

  1. DistilPose: Tokenized Pose Regression with Heatmap Distillation
  2. python办公(1)python来代替sh
  3. 电脑显示器和电视显示器底座的拆卸方法
  4. 中国太阳能充电控制器行业市场供需与战略研究报告
  5. MySQL触发器概念、原理与用法
  6. 跨境亚马逊注册流程图-企业店铺
  7. STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验
  8. 在ADS中查看端口输入阻抗的方法
  9. mi2 android 5.0 方法,下午5点 小米2/2S可直升安卓5.0
  10. 解决quasar中的q-tree结构default-expand-all不生效的问题