首页 技术 正文
技术 2022年11月16日
0 收藏 773 点赞 3,875 浏览 1676 个字

https://vjudge.net/problem/HDU-4261


对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价。


套路化地,设$f[i][j]$表示第$i$位,划了$j$块最小代价。然后dp。$O(n^3k)$不必说。($logn$和$k$看成同数量级,其实是$O(n^3(k+logn))$)

然后重点在于找中位数。上述暴力浪费在于每段区间中位数都要寻找一遍。可以用对顶堆(其实是不想写平衡树,或者不会更优秀,码量更小的玩意儿了),动态维护中位数,不多说了。求代价就是对两个堆总和记$s1,s2$,配合中位数即可算出,每算出一段的代价就顺便转移。

然后就$O(n^2k)$了。

不知道为什么跑那么快,直接在hdu屠榜rk1了。。qwq

Upd:被2人超过了。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define _dbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
ll f[N][],s1,s2,res;
int a[N];
int n,m;int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
while(read(n),read(m),n||m){
for(register int i=;i<=n;++i)read(a[i]);
memset(f,0x01,sizeof f);f[][]=;
for(register int i=;i<n;++i){
priority_queue<int> q1;
priority_queue<int,vector<int>,greater<int> > q2;
s1=s2=res=;
for(register int j=i+;j<=n;++j){
if(q1.empty()||a[j]<=q1.top())q1.push(a[j]),s1+=a[j];else q2.push(a[j]),s2+=a[j];
while(q1.size()>q2.size()+)s1-=q1.top(),s2+=q1.top(),q2.push(q1.top()),q1.pop();
while(q2.size()>q1.size())s2-=q2.top(),s1+=q2.top(),q1.push(q2.top()),q2.pop();
res=(q1.size()-q2.size())*1ll*q1.top()-s1+s2;
for(register int k=;k<m;++k)MIN(f[j][k+],f[i][k]+res);
}
}
printf("%lld\n",f[n][m]);
}
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898