题意:x轴上有n个人,让你放置m个集合点,使得每个人往离他最近的集合点走,所有人走的距离和最短。

把距离视为花费,设$dp[i][k]$表示前i个人分成k段的最小花费,则有递推式$dp[i][k]=min\{dp[j][k-1]+w(j,i)\}$,其中$w(j,i)$可以$O(1)$求出。

显然,如果考虑段数的话,光状态数就有n^2个,肯定行不通。不过这题的最优解对段数的函数是凸的,因此可以用WQS二分来打破段数的限制。

给每个集合点加上一个额外的花费c,然后忽略段数的限制,这样递推式就变成了$dp[i]=min\{dp[j]+w(j,i)\}+c$,这个递推式满足“决策单调性”,即如果i是由j转移而来,而i'>i,则j'>=j。这种dp是有一定的套路的,利用单调队列维护可能成为最优决策点的点以及它的左右边界,中间过程中需要不断地“掐头去尾”,及时弹出队首已经废掉的决策点,每push进一个结点,需要弹出队尾不如它优的决策点,并修改队尾的右边界,保证队首总是最优决策点。值得注意的是这道题的最优决策边界不像斜率优化那样明显可以直接算出来,也需要通过二分来确定。

然后在dp的过程中记录段数cnt[n],如果最优解分成了k段,那么dp[n]-k*c就是在划分为k段的条件下的最优解。根据k与m的大小关系进行二分,直到最优解恰好分成了m段为止。

你如果问为什么满足凸性和决策单调性?蒟蒻表示不会证,反正凭经验和直觉猜就对了,或者打表~~

复杂度$O(nlognlogA)$,这道题还要和卡常斗智斗勇,算法常数过大会T,变量全开longlong也会T...

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+,inf=0x3f3f3f3f;
int n,m,hd,tl,a[N],q[N],cnt[N],L[N],R[N];
ll S[N],dp[N],k;
ll sum(int l,int r) {return S[r]-S[l-];}
ll w(int i,int j) {
++i;
return sum((i+j+)>>,j)-sum(i,(i+j-)>>)+k;
}
int fd(int j,int k) {
int ret=R[k]+,l=L[k],r=R[k];
while(l<=r) {
int mid=(l+r)>>;
if(dp[j]+w(j,mid)<=dp[k]+w(k,mid))ret=mid,r=mid-;
else l=mid+;
}
return ret;
}
int solve() {
hd=tl=,L[]=,R[]=n,q[tl++]=;
for(int i=; i<=n; ++i) {
for(; hd<tl&&R[q[hd]]<i; ++hd);
dp[i]=dp[q[hd]]+w(q[hd],i);
cnt[i]=cnt[q[hd]]+;
for(; hd<tl&&dp[i]+w(i,L[q[tl-]])<=dp[q[tl-]]+w(q[tl-],L[q[tl-]]); --tl);
L[i]=(hd<tl?fd(i,q[tl-]):i+),R[i]=n;
if(hd<tl)R[q[tl-]]=L[i]-;
q[tl++]=i;
}
return cnt[n];
}
ll bi(ll l,ll r) {
ll ret;
while(l<=r) {
ll mid=(l+r)>>;
k=mid;
if(solve()>=m)ret=dp[n]-m*k,l=mid+;
else r=mid-;
}
return ret;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)scanf("%d",&a[i]);
for(int i=; i<=n; ++i)S[i]=S[i-]+a[i];
printf("%lld\n",bi(,S[n]+));
return ;
}

Gym - 101981B Tournament (WQS二分+单调性优化dp)的更多相关文章

  1. SCUT - 365 - 鹏哥的数字集合 - wqs二分 - 斜率优化dp

    https://scut.online/p/365 https://www.luogu.org/problemnew/solution/P2365 写这篇的时候还不是很明白,看一下这个东西. http ...

  2. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  3. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  4. [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)

    第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...

  5. 决策单调性优化dp 专题练习

    决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...

  6. 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)

    传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...

  7. 单调性优化DP

    单调性优化DP Tags:动态规划 作业部落链接 一.概述 裸的DP过不了,怎么办? 通常会想到单调性优化 单调队列优化 斜率优化 决策单调性 二.题目 [x] 洛谷 P2120 [ZJOI2007] ...

  8. BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】

    Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...

  9. [NOI2009]诗人小G 决策单调性优化DP

    第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); ...

随机推荐

  1. javaGuide_类文件结构

    一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决了传统解释型 ...

  2. 洛谷 题解 P2802 【回家】

    思路:DFS+剪枝 本题可以用一个字符二维数组来存整个地图,然后在往四个方向进行搜索.注意:当走到家门前要先判断血量!(本人就被坑了) 代码: #include<bits/stdc++.h> ...

  3. elasticsearch 安装head

    git clone https://github.com/mobz/elasticsearch-head.git yum install nodejs npm install 修改Elasticsea ...

  4. 《你必须知道的495个C语言问题》读书笔记之第1-2章:声明和初始化

    1. C标准中并没有精确定义数值类型的大小,但作了以下约束: (1) char类型可以存放小于等于127的值: (2) short int和int可以存放小于等于32767的值: (3) long i ...

  5. lua添加自定义模块的步骤

    以下方法在lua 5.2.4版本下成功实现: 1. lua.c为所有函数的主程序,参考Makefile的编译链接2. lua.c中int main (int argc, char **argv) { ...

  6. [转帖]Linux日期和时间的那些事儿

    Linux日期和时间的那些事儿 http://embeddedlinux.org.cn/emb-linux/entry-level/201311/09-2672.html 自己还是稚嫩啊.. 除了年龄 ...

  7. GitHub克隆下载代码速度慢解决办法

    这几天克隆下载GitHub代码奇慢无比,网上搜索了一下解决方案有些不太完整,自己试验出了比较完整的解决方式: 1.在hosts文件里追加以下内容(IP需要替换掉),以下几个域名一个都不要少,有些文章只 ...

  8. 编译+远程调试spark

    一 编译  以spark2.4 hadoop2.8.4为例 1,spark 项目根pom文件修改 pom文件新增 <profile> <id>hadoop-2.8</id ...

  9. QT 打包exe

    QT打包主要方法: 1.把无措的代码进行Release编译 2.在运行完后,找到运行后生成的目录,以下是我的文件,名为result,运行类型有两种,一种是Debug,另一种是Release,我们需要的 ...

  10. Ubuntu系统降内核

    本人安装的Ubuntu16.04.6系统原生内核为4.15.0,但安装的应用仅支持4.8.0以下内核,因此需要降内核.PS:降内核有风险,操作前请慎重 1.查看可用的内核 输入命令查看已经可用的内核 ...