http://www.lydsy.com/JudgeOnline/problem.php?id=3675

题意:给一个n个数字的序列,每一次分割的贡献是$sum(left, mid)*sum(mid+1, right)$,其中$left$表示本序列的最左边,$right$同理,$mid$是分割的位置(即在$mid$和$mid+1$中分割)。每次分割序列会变成两半。问分割k次得到的最大贡献和。n<=100000, k<=200

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
ll s[N], d[2][N];
int n, K, q[N], fr, ta;
int main() {
scanf("%d%d", &n, &K);
for(int i=1; i<=n; ++i) scanf("%lld", &s[i]), s[i]+=s[i-1];
ll *now=d[0], *last=d[1];
for(int p=1; p<=K; ++p) {
fr=ta=0; q[ta++]=0;
for(int i=1; i<=n; ++i) {
while(fr!=ta-1 && last[q[fr]]-last[q[fr+1]]<=(s[q[fr]]-s[q[fr+1]])*(s[n]-s[i])) fr++;
int j=q[fr];
now[i]=last[j]+(s[i]-s[j])*(s[n]-s[i]);
while(fr!=ta-1 && (last[i]-last[q[ta-2]])*(s[q[ta-1]]-s[q[ta-2]])>=(last[q[ta-1]]-last[q[ta-2]])*(s[i]-s[q[ta-2]])) --ta;
q[ta++]=i;
}
swap(last, now);
}
ll ans=0;
for(int i=1; i<=n; ++i) ans=max(ans, last[i]);
printf("%lld\n", ans);
return 0;
}

  

听laekov说要分析一下特殊的性质,于是分析了一下。。可以发现,每一个块对答案的贡献是$sum(本块)*sum(剩下的元素)$,最后当然要除以2,因为重复算了两次。但是可以用乱搞一下。。。

考虑dp,设$d(i, j)$表示这个序列在$i$分割了$j$次得到的答案且第$j$次是在$i$分割的。

容易得到:

$d(i, j)=max(d(k, j-1)+sum(k+1, i)*sum(i+1, n))$

大概就是表示得到的块为$(k+1, i)$,然后由于前面算过了对这些值的乘积,所以不用再计算一次(否则答案要除以二= =),于是我们直接乘一下后面的和即可。。

然后另$s(n)=\sum_{i=1}^{n} a[i]$,则

$d(i, j)=max(d(k, j-1)+(s(i)-s(k))*(s(n)-s(i)))$

然后搞搞斜率优化即可= =

(好久没写了然后发现自己维护上凸壳时整个人sb了。。。。队尾居然不是维护凸壳然后交了4发wa居然没发现。。

【BZOJ】3675: [Apio2014]序列分割的更多相关文章

  1. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 427[Submit][Statu ...

  2. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  3. bzoj 3675 [Apio2014]序列分割(斜率DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ...

  4. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...

  5. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  6. bzoj 3675: [Apio2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  7. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...

  8. bzoj 3675: [Apio2014]序列分割【斜率优化dp】

    首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...

  9. BZOJ 3675: [Apio2014]序列分割 动态规划 + 斜率优化 + 卡精度

    Code: #include<bits/stdc++.h> #define N 100006 #define M 205 #define ll long long #define setI ...

  10. 3675: [Apio2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

随机推荐

  1. eclipse使用tips-Toggle Mark Occurrences 颜色更改

    Toggle Mark Occurrences这个功能非常好用,能把选中的方法/变量在本类中全部出现的地方高亮显示,是一个非常实用的功能.但是默认颜色是灰色,非常毁眼.可以通过下面的设置更改为自己喜欢 ...

  2. Android 注解工具 ButterKnife

    Butter Knife 是 Android 视图字段和方法绑定,使用注解处理来生成样板代码. 主要特性: 在字段使用 @FindView消除findViewById调用 使用 @FindViews在 ...

  3. 小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】

    小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中 ...

  4. Spell checker

     Spell checker Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  5. babyClock 1.0发布(Android2.2以上)

    [总体说明] babyClock是以天为单位,进行提醒的小工具:可以设置多个闹钟,每个闹钟又按照频率分为多个提醒:过期后自动设置到明天该时刻进行提醒. 一个闹钟包含时间区段.提醒频率:进入时间区段时, ...

  6. Linux进程状态 ( Linux Process State Codes)

    进程状态代码及说明: STATE代码 说明 D 不可中断的睡眠. 通常是处于I/O之中. R 运行中/可运行. 正处于运行队列中. S 可中断的睡眠. 等待某事件发生. T 已停止. 可能是因为she ...

  7. go 入门之环境搭建-Windows

    网上有很多关于go的环境配置的文章,都没有说出关键点.对于一个新人来说,请使用IDE,而不是sublime text,vim之类的文本编辑器.当然,当你上手之后,可以随便玩. 笔者这里推荐新人使用 L ...

  8. phpcms-v9系统搭建wap网站及单页面

    如需要绑定域名为wap.domain.com,作下如操作: 一.把wap.domain.com域名绑定到你的这个网站主机上. 二.在网站后台——模块——手机门户域名里面填写“http://wap.do ...

  9. loj 1099(最短路)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25956 思路:dist[v][0]代表走到点v的最短路,dist[ ...

  10. ios 数据类型转换 UIImage转换为NSData NSData转换为NSString

    1.UIImage转换为NSData NSData *data;if (UIImagePNGRepresentation(image) == nil) { data = UIImageJPEGRepr ...