题意: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. logstash1 - kafka - logstash2 - elasticsearch - kibana

    0.拓扑图 参考:https://www.cnblogs.com/JetpropelledSnake/p/10057545.html 1.logstash的配置 [root@VM_0_4_centos ...

  2. jquery清除元素的点击事件

    $("#id").css("pointer-events", "none");

  3. SQLSERVER 查看服务器IP地址的命令

    今天进行负载均衡的测试的时候 想查询一下数据库相关信息 百度了下 找到解决方案为: SELECT SERVERNAME = CONVERT(NVARCHAR(),SERVERPROPERTY('SER ...

  4. 记录一次hadoop2.8.4版本RM接入zk ha问题

    背景: 公司将线上hadoop RM接入ZK 实现高可用 但ZK Znode 默认存储1M,当存储数据量大时候可能导致线上业务的崩溃 处理方案如下: 1,修改ZK配置 增加默认存储上限 2,修改RM数 ...

  5. php验证手机号记录

    看完就忘记录一下 正则: $roue = "/^1[3-9]\d{9}$/"; 前后/...... / 是正则必须的规则 ^1 : 手机号的必须是1开头   ^: 字符串开始的地方 ...

  6. 解决python在cmd运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"

    1.下图为我的自动化测试工程结构图 我通过运行run.bat批处理文件,调用cmd控制台运行start_run.py来开始我的自动化测试,但是出现如下错误: 大家可能知道我们的工程在IDE(Pycha ...

  7. docker部署redis

    镜像获取 docker pull redis:4.0 ##当前最新版本 docker images 启动 docker run --name redis-huiyuan -p : -v $PWD/da ...

  8. 图解Java继承内存分配

    图解Java继承内存分配   继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子 ...

  9. Api文档生成工具与Api文档的传播(pdf)

    点击查看apidoc生成文档demo 1 环境和工具 win10 apidoc:注释生成api文档 wkhtmltopdf:apidoc生成的是html,不适合传播,于是通过wkhtmltopdf将h ...

  10. 关键字:for_each

    std::for_each 先贴cppreference中对for_each的概述: template< class InputIt, class UnaryFunction > //此处 ...