POJ 3709 K-Anonymous Sequence(斜率优化DP)
【题目链接】 http://poj.org/problem?id=3709
【题目大意】
给出一个长度为n个非严格单调递增数列,每次操作可以使得其中任意一项减一,
问现在使得数列中每项数相同的数的数量都大于等于k-1,问最少进行几次操作
【题解】
我们设dp[i]为前i项答案,得到方程dp[i]=min(dp[j]+S[i]-S[j]-aj*(i-j)),
dp[i]=S[i]+min(dp[j]-S[j]+aj*j-aj*i),为关于i的线性函数,
所以我们对f(y)=-ax*y+dp[x]-S[x]+ax*x进行斜率优化。
【代码】
#include <algorithm>
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAX_N=500010;
int n,k;
LL a[MAX_N],dp[MAX_N],S[MAX_N],deq[MAX_N];
LL f(int x,int y){return -a[x]*y+dp[x]-S[x]+a[x]*x;}
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;
deq[0]=0; 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 T;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
solve();
}return 0;
}
POJ 3709 K-Anonymous Sequence(斜率优化DP)的更多相关文章
- POJ 3709 K-Anonymous Sequence - 斜率优化dp
描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j + sum_i - su ...
- [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 ...
- POJ 1180 Batch Scheduling(斜率优化DP)
[题目链接] http://poj.org/problem?id=1180 [题目大意] N个任务排成一个序列在一台机器上等待完成(顺序不得改变), 这N个任务被分成若干批,每批包含相邻的若干任务. ...
- poj 1180:Batch Scheduling【斜率优化dp】
我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...
- POJ3709 K-Anonymous Sequence 斜率优化DP
POJ3709 题意很简单 给n个递增整数(n<=500000)和一种操作(选择任意个数 使他们减少整数值) 使得对于所有的整数 在数列中 有k个相等的数 O(n^2)的DP方程很容易得出 如下 ...
- poj 1260 Pearls 斜率优化dp
这个题目数据量很小,但是满足斜率优化的条件,可以用斜率优化dp来做. 要注意的地方,0也是一个决策点. #include <iostream> #include <cstdio> ...
- 斜率优化dp(POJ1180 Uva1451)
学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- BZOJ 3156: 防御准备 斜率优化DP
3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...
随机推荐
- 【NOIP模拟赛】Evensgn 的债务 乱搞
biubiu~~~ 我们发现按照这道题的题意我们把一个个人的前后(欠钱,被欠钱)都缩一下,那么他对其他人没有影响,那么我们就可以依次缩完每个人,而且每个人最后的状态都是要买欠要么被欠,那么我们可以知道 ...
- CSS3边框会动的信封
<!DOCTYPE html><html> <head> <title>酷炫的CSS3</title> <meta charset=& ...
- 判断当前系统当前浏览器是否安装启用 Adobe Flash Player,检查在chrome中的状态
一.判断当前所在系统 let sUserAgent = navigator.userAgent;let isWin = (navigator.platform == "Win32" ...
- Unescape JavaScript's escape() using C#
js里面的 unescape escape 对应C#里面 var unescapedString = Microsoft.JScript.GlobalObject.unescape(yourEscap ...
- java常用的时间格式
年月日时分秒毫秒:yyyyMMddHHmmssSSS 毫秒用SSS表示.
- [Usaco2015 dec]Max Flow 树上差分
[Usaco2015 dec]Max Flow Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 353 Solved: 236[Submit][Sta ...
- hbase监控实现
目前实现的监控概览
- 7月23号day15总结
数据清洗完成之后开始编写前端,通过spring框架将清洗后数据库中的数据显示在页面中. 框架的搭建和js的使用都在学习阶段,
- barba.js 优化页面跳转用户体验
barba.js 原理就是在a页面中显示b页面的内容,样式为刷新,给用户以页面跳转后无刷新体验,注意样式命名,ab页面引用的样式和js要相同 可以在页面之间创建良好的转换,增强用户的体验. 减少HTT ...
- 面向对象的tab选项卡实现
利用最基础的面向对象的思想,实现tab选项卡效果: 效果截图: