POJ3709

题意很简单 给n个递增整数(n<=500000)和一种操作(选择任意个数 使他们减少整数值) 使得对于所有的整数 在数列中 有k个相等的数

O(n^2)的DP方程很容易得出 如下

dp[i]=min{dp[j]+S[i]-S[j]-aj*(i-j)}| 0<=j<=i-k}

进一步变形 设fj(x)=-aj*x+dp[j]-S[j]+aj*j

可得 dp[i]=S[i]+min{fj(i)|0<=j<=i-k}

也就是说 计算dp[i]相当于从i-k+1条直线中寻找在点x=i处的最小值。

而dp[i+1]与dp[i]的区别仅在于需要多考虑一条直线,并且所求的x坐标值增加1.

想想题目给我们的是一个递增的数列,而直线的系数为-aj 也就是说增加一条新的直线 它的斜率必然是最小的。

下面尝试用队列维护这个直线的集合


对于三条直线 f1 f2 f3 满足斜率递减 则在某种情况下,f2一定是多余的,可以删除。

这种情况就是 f3与f1的交点在f2与f1的交点之前, 三条直线所组成的最小值折线一定没有f2的部分 所以可以删掉f2

于是维护队列的方法就得到了

i每增加1 当队头的直线不是最小值时则删除(因为它之后的直线斜率一定比它小)

增加一条直线时,先删除所有多余的直线.

显然队列的操作次数总共为n 所以算法总的复杂度为O(n)

给出代码 比较简单

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=500000+1;
typedef long long int LL;
int n,k;
LL a[MAXN],S[MAXN],dp[MAXN];
int deq[MAXN]; LL f(int j,int x)
{
return -a[j]*x+dp[j]-S[j]+a[j]*j;
} bool check(int f1,int f2,int f3)
{
LL a1=-a[f1],b1=dp[f1]-S[f1]+a[f1]*f1;
LL a2=-a[f2],b2=dp[f2]-S[f2]+a[f2]*f2;
LL a3=-a[f3],b3=dp[f3]-S[f3]+a[f3]*f3;
return (a2-a1)*(b3-b2)>=(b2-b1)*(a3-a2);
} void solve()
{
for(int i=0;i<n;i++) S[i+1]=S[i]+a[i]; int s=0,t=1;
dp[0]=0;
for(int i=k;i<=n;i++)
{
if(i-k>=k)
{ while(s+1<t&&check(deq[t-2],deq[t-1],i-k))t--;
deq[t++]=i-k;
}
while(s+1<t&&f(deq[s],i)>=f(deq[s+1],i))s++; dp[i]=S[i]+f(deq[s],i);
}
printf("%lld\n",dp[n]);
} int main()
{freopen("t.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
solve();
}
return 0;
}

  

POJ3709 K-Anonymous Sequence 斜率优化DP的更多相关文章

  1. [POJ1180&POJ3709]Batch Scheduling&K-Anonymous Sequence 斜率优化DP

    POJ1180 Batch Scheduling Description There is a sequence of N jobs to be processed on one machine. T ...

  2. POJ 3709 K-Anonymous Sequence - 斜率优化dp

    描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j  + sum_i - su ...

  3. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  4. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  5. HDU2829 Lawrence(斜率优化dp)

    学了模板题之后上网搜下斜率优化dp的题目,然后就看到这道题,知道是斜率dp之后有思路就可以自己做不出来,要是不事先知道的话那就说不定了. 题意:给你n个数,一开始n个数相邻的数之间是被东西连着的,对于 ...

  6. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  7. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  8. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

  9. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

随机推荐

  1. 早期创业,应该充分利用互联网产品和服务(从”皇包车”看一家全球中文车导服务平台如何选用ToB产品)

       前段时间,在搜索"皇包车"相关的资料,于是在IT桔子网站看到了"从'皇包车'看一家全球中文车导服务平台如何选用ToB产品"这篇文章.   我是非常的震撼! ...

  2. [WPF自定义控件库]为Form和自定义Window添加FunctionBar

    1. 前言 我常常看到同一个应用程序中的表单的按钮----也就是"确定"."取消"那两个按钮----实现得千奇百怪,其实只要使用统一的Style起码就可以统一按 ...

  3. xtu summer individual 6 E - Find Metal Mineral

    Find Metal Mineral Time Limit: 1000ms Memory Limit: 65768KB This problem will be judged on HDU. Orig ...

  4. 全文检索(AB-1)-相关领域

    信息检索 认知科学 管理科学

  5. Spring Data Jpa系列教程--------实体解析和关联关系

    Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...

  6. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  7. 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)

    题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...

  8. hdu - 1689 Just a Hook (线段树区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 n个数初始每个数的价值为1,接下来有m个更新,每次x,y,z 把x,y区间的数的价值更新为z(1<= ...

  9. [bzoj1324]Exca王者之剑_最小割

    Exca王者之剑 bzoj-1324 题目大意:题目链接. 注释:略. 想法: 最小割经典模型. 所有格子向源点连权值为格子权值的边. 将棋盘黑白染色后白点反转源汇. 如果两个格子相邻那么黑点向白点连 ...

  10. html实现类似excel的复杂表格,及导出到excel

    1. excellentexport.js https://github.com/jmaister/excellentexport/tree/2.0.3 2.fiddle example  https ...