POJ 3709 K-Anonymous Sequence - 斜率优化dp
描述
给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量
题解
易得到状态转移方程 $F_i = \min(F_j + sum_i - sum_j - (i - j ) \times a_(j+1) ) $ $ 0 <= j <= i - k$。
把只含$j$ 放在一边, 其他的放在另一边得到:$F_j + j \times a_(j+1) - sum_j = i \times a_(j+1) F_i - sum_i$
然后就可以愉快地套上斜率优化的板子了QuQ
还有这道题我用叉积挂了唔, 数列$a_i$是不严格递增的,点重合就挂了(也有可能是我自己打挂了
代码
#include<cstring>
#include<cstdio>
#include<algorithm>
#define rd read()
#define rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define per(i,a,b) for( int i = (a); i >= (b); --i)
using namespace std;
typedef long long ll; const int N = 1e6;
const ll inf = 1LL << ; ll sum[N], f[N], q[N], d[N];
int n, T, k; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if( c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} double calc(int a, int b) {
double y = f[b] + b * d[b + ] - sum[b] - f[a] - a * d[a + ] + sum[a];
double x = d[b + ] - d[a + ];
if(!x && !y) return inf;
return y / x;
} int main()
{
T = rd;
for(; T; T--) {
n = rd; k = rd;
rep(i, , n) d[i] = rd, sum[i] = sum[i - ] + d[i];
rep(i, k, n) f[i] = sum[i] - i * d[];
rep(i, , k - ) f[i] = inf;
int l = , r = ;
q[] = k;
rep(i, * k, n) {
while(l < r && calc(q[l], q[l + ]) <= i) l++;
f[i] = min(f[i], f[q[l]] + sum[i] - sum[q[l]] - (i - q[l]) * d[q[l] + ]);
while(l < r && calc(q[r - ], q[r]) >= calc(q[r], i - k + )) r--;
q[++r] = i - k + ;
}
printf("%lld\n", f[n]);
}
}
POJ 3709 K-Anonymous Sequence - 斜率优化dp的更多相关文章
- [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 共一个整数,表示最小的战 ...
随机推荐
- Web of Science数据库中文献相关信息下载与保存
1. Web of Science 数据库(https://apps.webofknowledge.com/): a. 所在网络必须由访问 该网站的权限. b.建议使用web of Science的核 ...
- display属性详解
内容: 1.display介绍 2.display分类 3.块级标签和内联标签 4.inline-block应用 1.display介绍 display:display属性设置元素如何被显示 2.di ...
- Github入门 - Github基本使用及Github桌面版使用
知识内容: 1.版本控制 2.Git介绍 3.Github介绍及基本使用 4.Github桌面版介绍及安装 5.Github桌面版基础使用 6.Github桌面版进阶使用 参考: http://www ...
- 0_Simple__simpleLayeredTexture
二维分层纹理 ▶ 源代码.用纹理方法把元素按原顺序从 CUDA3D 数组中取出来,求个相反数再加上层数放入全局内存,输出. #include <stdio.h> #include &quo ...
- CUDA C Programming Guide 在线教程学习笔记 Part 2
▶ 纹理内存使用 ● 纹理内存使用有两套 API,称为 Object API 和 Reference API .纹理对象(texture object)在运行时被 Object API 创建,同时指定 ...
- 2.登录linun 输入密码登录不进去 进入单用户模式 修改 然后reboot
centos进入单用户模式 单用户模式,就是你现在站在这台机器面前能干的活,再通俗点就是你能够接触到这个物理设备. 一般干这个活的话,基本上是系统出现严重故障或者其他的root密码忘记等等,单用户模式 ...
- WP runtime local setting
https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.applicationdata.localsettings. ...
- springMVC学习记录1-使用XML进行配置
SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...
- 通过python构建集中式的病毒扫描机制
Clam AntiVirus(Clam AV)是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux.Uinux系统提供病毒扫描查杀pyClamad ...
- 使用 ImageEnView 给图片加水印,及建缩略图
摘要: 使用 ImageEnView 给图片加水印,及建缩略图 {Power by hzqghost@21cn.com}unit CutWater; interface uses Math,imag ...