首先枚举出所有可能成为区间最小差值的点对$(j,i)$。

枚举每个位置作为右端点$i$,假设$a[j]>a[i]$。

找到第一个这样的$j$,那么可以将下一个$a[j]$的范围缩小到$(a[i],\frac{a[i]+a[j]}{2})$。这是因为在这之外的数要么没有$j$优,要么会被$j$考虑到。

利用可持久化线段树可以很容易地找到下一个$j$的位置,最多$O(n\log n)$个点对,时间复杂度$O(n\log^2n)$。

接下来的问题等价于选择$k$条不相交线段,使得价值和最小。

将线段按左端点从小到大排序,设$f[i][j]$表示考虑前$i$条线段,选择了$j$条线段的最优价值,可以通过双指针优化到$O(kn\log n)$。

注意到$f[all][j]$是个凸函数,故可以二分斜率$mid$来切它,具体体现为每选一条线段,价值就多加$mid$。

那么随着$mid$的增大,最优解中选择的线段数目会越来越少。

二分找到最优解中线段数目最接近$k$的$mid$即可。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=50010,M=N*18;
int n,m,K,i,a[N],tot,T[N],l[M],r[M],v[M],tmp,ans,s[N],g[M*2];double L,R,MID,f[M*2];
struct E{int l,r,v;E(){}E(int _l,int _r,int _v){l=_l,r=_r,v=_v;}}e[M*2];
inline bool cmp(const E&a,const E&b){return a.l<b.l;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int ins(int x,int a,int b,int c,int p){int y=++tot;v[y]=p;if(a==b)return y;int mid=(a+b)>>1;if(c<=mid)l[y]=ins(l[x],a,mid,c,p),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c,p);return y;
}
void ask(int x,int a,int b,int c,int d){if(!x)return;if(c<=a&&b<=d){if(v[x]>tmp)tmp=v[x];return;}int mid=(a+b)>>1;if(c<=mid)ask(l[x],a,mid,c,d);if(d>mid)ask(r[x],mid+1,b,c,d);
}
inline void findbigger(int x){int l=a[x]+1,r=n,t=x-1;while(l<=r&&t){tmp=0;ask(T[t],1,n,l,r);if(!tmp)return;t=tmp;e[++m]=E(t,x,a[t]-a[x]);r=(a[x]+a[t--]-1)>>1;}
}
inline void findsmaller(int x){int l=1,r=a[x]-1,t=x-1;while(l<=r&&t){tmp=0;ask(T[t],1,n,l,r);if(!tmp)return;t=tmp;e[++m]=E(t,x,a[x]-a[t]);l=(a[x]+a[t--]+2)>>1;}
}
inline void up(int&x,int y){if(f[x]>f[y])x=y;}
inline void cal(){int i,j;for(i=1;i<=n;i++)s[i]=0;for(i=1,j=ans=0;i<=m;i++){while(j+1<e[i].l){j++;up(s[j],s[j-1]);}f[i]=f[s[j]]+e[i].v+MID;g[i]=g[s[j]]+1;up(s[e[i].r],i);up(ans,i);}
}
int main(){read(n),read(K);for(i=1;i<=n;i++)read(a[i]),T[i]=ins(T[i-1],1,n,a[i],i);for(i=1;i<=n;i++)findbigger(i),findsmaller(i);sort(e+1,e+m+1,cmp);L=-1e9,R=1e9;for(int _=80;_;_--){MID=(L+R)/2;cal();if(g[ans]==K)break;if(g[ans]<K)R=MID;else L=MID;}return printf("%.0f",f[ans]-MID*K),0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/7237386.html

BZOJ4167 : 永远的竹笋采摘相关推荐

  1. bzoj4167 永远亭的竹笋采摘

    由于是随机数据,用分块加乱搞就可以水过. 详情参见大佬的博客:题解 贴个代码: #include<cstdio> #include<cstring> #include<v ...

  2. BZOJ4167: 永远亭的竹笋采摘 分块

    题意:给定一个序列,将其分成K段,每段元素不得全相同,求sigma(每段中不同元素差值的最小值)的最小值 n<=50000,k<=1000,序列中元素<=n,序列随机生成 既然序列是 ...

  3. HN2015集训 永远亭的竹笋采摘

    第一反应肯定是dp啦,然后就会愉快的T成一头象拔蚌. 那么,说说正解吧. 显然,选取的区间一定可以是两头为差值最小的.那就好办了,只需要预处理出所有的这样的区间,再dp即可,由于数据是随机生成的,所以 ...

  4. 生命里永远有一种等待

    生命里永远有一种等待 开端 新的改变 博客的开端 <生命里永远有一种等待> 开端 今日四月出头时,出门采风好时光.简单搜索附近的绿地,发现有一"盛誉田"尚可,遂骑行前往 ...

  5. python是最好的语言 永远二十岁_Python是世界上最好的语言吗?

    编程语言的选择是IT圈子永远的争议.在任意一个程序员聚集的场合,喊一句类似于"PHP是世界上最好的语言"这样的话,肯定会惹来不少人和你争论得面红耳赤.那么,python是世界上最好 ...

  6. 影像锐化工具_如何以及为什么要进行工具改造:花在锐化斧头上的时间永远不会浪费...

    影像锐化工具 by Harshdeep S Jawanda 通过Harshdeep S Jawanda 如何以及为什么要进行工具改造:花在锐化斧头上的时间永远不会浪费 (How and why you ...

  7. 采摘工人月薪十万却无人应聘,英澳农场求助 AI

    作者 | 神经小兮 来源 | HyperAI超神经 金秋时节,本是收获的季节,但是英国.澳大利亚等地的果农却愁容满面. 眼看着日渐成熟的瓜果就要烂在地里,却还招不到采摘工人.缺人,成为果农们眼下急需解 ...

  8. 微软曾经的二号人物永远地离开了

    参加 2018 AI开发者大会,请点击 大会官网 他是一位发明家.投资者.考古学家和慈善家,"他对微软做出的不可或缺的贡献"会让人们永远铭记. 据外媒 CNBC 今日早间报道,微软 ...

  9. 李彦宏:简单搜索永远没有广告;安全是自动驾驶第一天条

    图片来源:新华网 在26日下午举办的2018数博会"人工智能:AI 生态加速未来"论坛中,百度董事长兼CEO李彦宏.中国科学院院士张钹.微软全球资深副总裁王永东等嘉宾分别发表了关于 ...

最新文章

  1. 做程序猿的老婆应该注意的一些事情
  2. 自己动手写java虚拟机_自己动手写操作系统(要了解的知识点)
  3. POJ2398【判断点在直线哪一侧+二分查找区间】
  4. Web前端新手必看的7种技术,从菜鸟到高级开发的蜕变!
  5. bzoj 3745 [Coci2015]Norma——序列分治
  6. Hive 使用SQL统计出每个用户的累积访问次数
  7. 前端逼死强迫症系列之javascript
  8. 属性动画实现卫星菜单效果
  9. 【原创】新韭菜日记31--一个韭菜的自我修养,学习什么是白马蓝筹
  10. HTML中如何使用JavaScript创建链接?
  11. 计算机word的关闭怎么办,为什么我的计算机word文档打开和关闭缓慢
  12. idr寄存器、_STM32 GPIO寄存器 IDR ODR BSRR BRR
  13. Android中怎么破解游戏之修改金币数
  14. Mac中安装软件的传送门
  15. Luckysheet 导入导出 - Java后台处理和js前端实现
  16. 「学习笔记」黑马面面布局开发
  17. 【晒出你的第83行代码】《阿里巴巴Java开发手册》主要作者孤尽晒出入职第一年的代码...
  18. 3D游戏引擎系列十一
  19. 北航计算机刘强,刘强 LIU Qiang
  20. 西红柿炒鸡蛋怎么做(大厨教程 教你炒出饭店的味道)

热门文章

  1. android 平板的 dpi,Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸...
  2. 微信公众号跳转到手机默认浏览器打开指定页面功能怎样实现?
  3. 若依图片上传到服务器,前端显示图片
  4. 是非人生 — 一个菜鸟程序员的5年职场路 第4节
  5. 社群运营岗位部门团队KPI绩效sop工作流程计划方案
  6. 算法分析----基础知识点
  7. android 头部伸缩listview,AndroidUIAndroid中listview可折叠伸缩仿手风琴效果(静态) -电脑资料...
  8. 10年网安经验分享:一般人别瞎入网络安全行业
  9. 【面试】为什么面试完,总是让你回去等通知?
  10. 总结低代码海报平台编辑器难点