本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000 
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:http://uoj.ac/problem/104

正解:DP+斜率优化

解题报告:

  容易发现,答案只和分割处有关,与顺序无关。

  所以朴素方程很容易得到:

  令${S[n]=\sum_{i=1}^{n}a[i]}$

  ${f[i][k]=max(f[j][k-1]+S[j]*(S[i]-S[j])) ,j<i}$  

  对于${j1,j2}$且满足${j1<j2}$,${f[j1][k-1]<f[j2][k-1]}$,显然$j1$可以被删除,则

  ${f[j1][k-1]+S[j1]*(S[i]-S[j1]) < f[j2][k-1]+S[j2]*(S[i]-S[j2])}$   

  化简后:

  ${f[j1][k-1]-f[j2][k-1]+S[j2]^2-S[j1]^2 > S[i]*(S[j2]-S[j1])}$

  令${g[i][k]=f[i][k]-S[i]^2}$

  则${g[j1][k-1]-g[j2][k-1]>S[i]*(S[j2]-S[j1])}$

  到了这一步,正解就已经呼之欲出了。显然我们可以用斜率优化+单调队列,把DP优化到$O(nk)$,做k次,每次只需扫一遍。

  队首如果满足上式,则直接删掉。加入队尾的时候,看一下斜率的变化趋势,如果不满足则pop掉。

  

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <complex>
using namespace std;
typedef long long LL;
const int MAXN = 100011;
int n,k,dui[MAXN],head,tail;
LL g[MAXN],s[MAXN],f[MAXN],F[MAXN];
int ans[MAXN],pre[MAXN][211];
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline LL calc(int i,int j1,int j2){ return s[i]*(s[j2]-s[j1]); } inline void work(){
n=getint(); k=getint(); for(int i=1;i<=n;i++) s[i]=getint();
for(int i=2;i<=n;i++) s[i]+=s[i-1]; for(int i=1;i<=n;i++) g[i]=-s[i]*s[i];
for(int nowk=2;nowk<=k+1;nowk++) {
head=tail=0;
dui[++tail]=nowk-1;
for(int i=nowk;i<=n;i++) {
while(head<tail && calc(i,dui[head],dui[head+1])>=(g[dui[head]]-g[dui[head+1]])) head++;
F[i]=f[dui[head]]+s[dui[head]]*(s[i]-s[dui[head]]); pre[i][nowk-1]=dui[head];
while(head<tail && (g[dui[tail-1]]-g[dui[tail]])*(s[i]-s[dui[tail]]) >= (g[dui[tail]]-g[i])*(s[dui[tail]]-s[dui[tail-1]]))
tail--;
dui[++tail]=i;
}
for(int i=nowk;i<=n;i++) f[i]=F[i],g[i]=F[i]-s[i]*s[i];
}
printf("%lld\n",F[n]);
for(int i=n,j=k;i>0;j--) i=pre[i][j],ans[j]=i;
for(int i=1;i<=k;i++) printf("%d ",ans[i]);
} int main()
{
work();
return 0;
}

  

  

UOJ104 【APIO2014】Split the sequence的更多相关文章

  1. UOJ#104. 【APIO2014】Split the sequence 动态规划 斜率优化

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ104.html 题解 首先证明一个结论:对于一种分割方案,分割的顺序不影响最终结果. 证明:对于树 a[x] 和 a[y] ...

  2. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  3. 【BZOJ4355】Play with sequence 线段树

    [BZOJ4355]Play with sequence Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a ...

  4. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

  5. 【题解】Cut the Sequence(贪心区间覆盖)

    [题解]Cut the Sequence(贪心区间覆盖) POJ - 3017 题意: 给定一大堆线段,问用这些线段覆盖一个连续区间1-x的最小使用线段的数量. 题解 考虑一个这样的贪心: 先按照左端 ...

  6. 【规律】A Rational Sequence

    题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...

  7. 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1041 题目大意: 一个二维平面,上面n(n<=1 000 000)个点.问至少选 ...

  8. 【动态规划】XMU 1583 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1583 题目大意: T组数据,对于n(n<=6000)给定序列Xn(Xn<= ...

  9. 【SPOJ】2319 BIGSEQ - Sequence

    [算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...

随机推荐

  1. EF 批量更新删除(linq篇)

    刚开始用EF很多东西都不会用,事后想想都很简单的东西总是用很麻烦的方式实现 1:  EF的联合查询 inner join  很久很久以前我是这么写一个列表展示的,其中有两个字段Contractor和M ...

  2. Error: member names cannot be the same as their enclosing type

    在编译的时候会遇到如下问题:member names cannot be the same as their enclosing type 原因:方法名和类名不能一样,如果一样就是一个构造函数.而构造 ...

  3. 在使用NavigationController情况下的布局的Y轴的起始位置

    在有的时候,当一个ViewController被push进一个NavigationController的时候,view上会有一个高度为64的NavigationBar(除非主动隐藏了Navigatio ...

  4. es 中 for in for of

    arr=[11,22,33,44,55,66,77,88]for (const i in arr){ console.log(i) if (i===4){ console.log(arr[i]) }} ...

  5. java设计模式学习 ----- 工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...

  6. ubuntu17.04 配置go环境变量

    把官网下载好的tar解压后,go文件夹放到 /usr/local 目录下 在当前用户的 .bashrc 文件末尾添加 这句话 export PATH=$PATH:/usr/local/go/bin 执 ...

  7. redis3.2.11单机多实例集群部署并测试连接情况

    配置准备: redis3.2.11安装配置规划 机器 192.168.169.135(本机虚拟机) 系统 Red Hat Enterprise Linux Server release 6.4 (Sa ...

  8. linux各个文件夹作用

    linux /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/ho ...

  9. 剑指offer 面试47题

    面试47题:题:礼物的最大价值 题目:在一个mxn的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0),你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的 ...

  10. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...