决策单调性 + WQS二分

我们首先列出转移式: \(f[i]=Min(f[j]+Sum[j+1 , i])\)

首先我们考虑如果让一段区间的小鱼在一起的代价怎么预处理,我们可以对于一个上三角矩阵求个二维前缀和,那么我们计算 \([j+1,i]\) 这段区间的代价就是 \(S[i,i]-S[i,j]\) ,得到的是一个等腰直角三角形的和

那么原来的转移式就可以这么写:\(f[i]=Min(f[j]+S[i,i]-S[i,j])\)

然后我们不考虑车辆数量的限制,那么对于 j 和 k ,如果 \(j<k\) ,那么首先 \(f[j]\) 必然小于 \(f[k]\) ,但是随着 i 的增大, \(S[i,i]\) 是不变的,但是 \(S[i,j]\) 和 \(S[i,k]\) 之间的差肯定是越来越大的,即对于 \(f[j]-S[i,j]\) 和 \(f[k]-S[i,k]\) ,肯定是一开始选 j 比较优,后来两个函数有一个交点,过了这个交点就是 k 比较优了,并且两个函数的交点只有一个,所以我们可以二分一个交点,然后保持交点和 j 同时单调递增,这样就可以做一个 O(n) 的斜率优化 dp 了...

但问题是这 goushi 的车辆是有数量限制的,但是我们发现总价格和使用车辆数是负相关的,那么我们可以考虑对于每辆车加上一个租赁代价,这在斜率优化中是不影响计算的,然后租赁的代价越高,最优解中使用车辆数肯定越小,那么我们可以二分这个租赁代价,得到车辆数恰好为指定的 K 时,把租赁的代价减去,这样就得到了答案

总复杂度讲道理是 \(O(n~log n ~ log ~S[n,n])\) ,因为外面 wqs 二分 \(S[n,n]\),里面也要二分交点

code

//by Judge
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int M=4003;
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline ll read(){ ll x=0,f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} int n,K,ans,s[M][M],f[M],w[M];
inline int calc(int j,int i){return f[j]+s[i][i]-s[j][i];
}
inline bool judge(int j,int k,int i){ //判断 f[i] 大小 int valj=calc(j,i),valk=calc(k,i);if(valj^valk) return valj>valk;return w[j]>=w[k];
}
inline int rate(int j,int k){  //得到交点位置 int l=k+1,r=n;while(l<=r){int mid=(l+r)>>1;if(judge(j,k,mid)) r=mid-1;else l=mid+1;} return l;
}
inline bool check(int mid){ //二分附加权值 static int head,tail,q[M];q[head=tail=1]=0;fp(i,1,n){ //斜率优化 while(head<tail&&judge(q[head],q[head+1],i)) ++head;f[i]=calc(q[head],i)+mid,w[i]=w[q[head]]+1;while(head<tail&&rate(q[tail-1],q[tail])>rate(q[tail],i)) --tail; q[++tail]=i;} return w[n]<=K;
}
int main(){ n=read(),K=read();fp(i,1,n) fp(j,1,n) s[i][j]=read();fp(i,1,n) fp(j,1,i) s[i][j]=0;fp(i,1,n) fp(j,1,n) s[i][j]=s[i][j-1]+s[i][j];fp(i,1,n) fp(j,1,n) s[i][j]=s[i-1][j]+s[i][j];int l=0,r=s[n][n];while(l<=r){ int mid=(l+r)>>1;if(check(mid)) r=mid-1,ans=f[n]-K*mid;else l=mid+1;} return !printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/Judge/p/11311660.html

【CF321E】+【bzoj5311】贞鱼相关推荐

  1. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  2. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  3. CF321E Ciel and Gondolas BZOJ 5311 贞鱼

    一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜. 设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么 $f_{i, j} = f_{p, j ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. Codeforces Round #190 (Div. 1): E. Ciel and Gondolas(决策单调性DP+wqs二分)

    E. Ciel and Gondolas 题意: bzoj5311:https://www.lydsy.com/JudgeOnline/problem.php?id=5311 同一道题目,但是bzoj ...

  6. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  7. 《东周列国志》第六十一回 晋悼公驾楚会萧鱼 孙林父因歌逐献公

    话说晋及诸侯之兵,围了偪阳城二十四日,攻打不下,忽然天降大雨,平地水深三尺,荀偃.士匄二将虑军心有变,同至中军来禀智䓨曰:"本意谓城小易克,今围久不下,天降大雨,又时当夏令,水潦将发,泡水在 ...

  8. c语言鱼图形怎样编,如何编写C语图形程序.pdf

    如何编写C语图形程序 聊 竞 节 控 绒 仙 兵 牧 祥 叶 撒 绳 温 钨 让 驱 赎 戌 裔 丛 嫌 茹 桶 噪 挤 区 糕 弦 兔 凝 央 址 搽 胃 寸 茅 煽 哩 圾 黑 咙 寄 限 吸 缀 ...

  9. scala语言运行递归“分鱼”程序

    A.B.C.D.E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉. 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份. B 第二个醒来,也将鱼分为 ...

最新文章

  1. php仿攻击,PHP写的仿DDOS攻击程序代码
  2. Hadoop Eclipse开发环境设置
  3. 【死磕Java并发】—–深入分析synchronized的实现原理
  4. 计算机视觉模型、学习和推理
  5. 收藏 | 循环神经网络 RNN 详细图解!
  6. 有哪些越早知道越好的人生经验?
  7. jQuery框架总体分析
  8. npm 使用报错合集
  9. xaml mvvm(1)之结构
  10. 全国DNS服务器IP地址【电信、网通、铁通】
  11. Mac上删除音频设备
  12. 反激式开关电源理论与原理解析
  13. android按钮图标大小设置,调整浮动操作button(fab)的图标大小
  14. 等保之——等级保护2.0要求及所需设备清单
  15. vba打开html文件,VBA调用浏览器打开指定网页的几种方法
  16. python统计英文单词个数_统计英文单词的个数的python代码 及 字符串分割
  17. 笔记怎么放思维导图图片
  18. 深度学习的下一个十年,延展基础科学研究变革的「角力场」
  19. 批量导出数据库中的表
  20. 浅谈鸽巢原理的证明和简单应用

热门文章

  1. 【Java 多线程】互斥锁,自旋锁和读写锁
  2. BZOJ1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配
  3. 受够了if (ModelState.IsValid)?ActionFitlter也是一路的坑啊!
  4. ExtJS 4.2 教程-07:Ext.Direct
  5. dotnet 获得存储过程返回值和输出参数有什么不同 @@IDENTITY SCOPE_IDENTITY()
  6. SQLServer格式化时间
  7. vue中的v-text指令之Vue知识点归纳(二)
  8. java基础—FileWriter 的使用
  9. Mr.J--心形跳动demo
  10. 在生成.net core 3.0程序时不包含nuget库