洛谷3648 [APIO2014]序列分割(斜率优化+dp)
首先对于这个题目。
qwq
存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关。
举一个小栗子
\(a\ b\ c\)
将这个东西分成两块。
如果我们先分割\(ab\)之间的话,\(ans = a*(b+c) + b*c\)
如果先分割\(bc\)之间的话,\(ans=c*(a+b)+a*b\)
答案是一样的。(也可以理解成如果位置,两数相乘的次数是一定的)
那么得到这个结论之后
也就不难得出\(dp\)柿子了
\]
设\(f[x]=dp[x]-sum[x]*sum[x]\)
经过推柿子$$\frac{f[j]-f[k]}{sum[j]-sum[k]} > -sum[i]$$
然后直接上斜率优化
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 1e5+1e2;
struct Point
{
ll x,y;
int num;
};
ll chacheng(Point x,Point y)
{
return x.x*y.y-x.y*y.x;
}
bool count(Point i,Point j,Point k)
{
Point x,y;
x.x=k.x-i.x;
x.y=k.y-i.y;
y.x=k.x-j.x;
y.y=k.y-j.y;
if (chacheng(x,y)>=0) return true;
return false;
}
struct Node{
Point q[maxn];
ll head=1,tail=0;
void push(Point x)
{
while (tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;
q[++tail]=x;
}
void pop(int lim)
{
while (tail>=head+1 && (q[head+1].y-q[head].y > lim * (q[head+1].x-q[head].x))) head++;
}
};
Node q[210];
ll sum[maxn];
int n,k;
ll dp[2][210];
int pos[100010][210];
int main()
{
n=read();k=read();
k++;
for (int i=1;i<=n;i++) sum[i]=read();
for (int i=1;i<=n;i++) sum[i]+=sum[i-1];
q[0].push((Point){0,0,0});
for (int i=1;i<=n;i++)
{
for (int j=1;j<=min(i,k);j++)
{
q[j-1].pop((-1)*sum[i]);
Point now = q[j-1].q[q[j-1].head];
dp[i&1][j]=now.y+now.x*now.x+(sum[i]-now.x)*now.x;
pos[i][j]=now.num;
q[j].push((Point){sum[i],dp[i&1][j]-sum[i]*sum[i],i});
}
}
cout<<dp[n&1][k]<<endl;
for (int i=n,j=k;i && j>1;i=pos[i][j],j--)
cout<<pos[i][j]<<" ";
cout<<endl;
return 0;
}
洛谷3648 [APIO2014]序列分割(斜率优化+dp)的更多相关文章
- bzoj3675[Apio2014]序列分割 斜率优化dp
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3508 Solved: 1402[Submit][Stat ...
- [APIO2014]序列分割 --- 斜率优化DP
[APIO2014]序列分割 题目大意: 你正在玩一个关于长度为\(n\)的非负整数序列的游戏.这个游戏中你需要把序列分成\(k+1\)个非空的块.为了得到\(k+1\)块,你需要重复下面的操作\(k ...
- 【bzoj3675】[Apio2014]序列分割 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6835179.html 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列 ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...
- 洛谷 P3648 [APIO2014]序列分割 解题报告
P3648 [APIO2014]序列分割 题目描述 你正在玩一个关于长度为\(n\)的非负整数序列的游戏.这个游戏中你需要把序列分成\(k+1\)个非空的块.为了得到\(k+1\)块,你需要重复下面的 ...
- P3648 [APIO2014]序列分割 斜率优化
题解:斜率优化\(DP\) 提交:\(2\)次(特意没开\(long\ long\),然后就死了) 题解: 好的先把自己的式子推了出来: 朴素: 定义\(f[i][j]\)表示前\(i\)个数进行\( ...
- 洛谷P2365 任务安排(斜率优化dp)
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...
- 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP
做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...
- BZOJ 3675 APIO2014 序列切割 斜率优化DP
题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...
随机推荐
- Kafka详细教程加面试题
一.部署kafka集群 启动zookeeper服务: zkServer.sh start 修改配置文件config/server.properties #broker 的全局唯一编号,不能重复 bro ...
- shutdown 命令
# shutdown -h #停止系统服务并关机 -r #停止系统服务后重启 shutdown -h now #立即关机 shutdown -h 10:53 #到10:53关机,如果该时间小于当前时间 ...
- Pytest 系列(26)- 清空 allure 历史报告记录
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 背景 pytest 运行 测试用例 ...
- 了解mysql concat()函数
concat(arg1,arg2,....):将形参对应字段的值组合成一个字符串 假设:现在有一张学生表(test_user) 将这三个字段组合成一个字符串作为第四个字段 select test_us ...
- Hamcrest 断言框架
Hamcrest是一个为了测试为目的,能组合成灵活表达式的匹配器类库.用于编断言的框架,使用这个框架编写断言,提高可读性及开发测试的效率,提供了大量"匹配器"方法,每个匹配器用于执 ...
- IIS中配置WCF站点
http://msdn.microsoft.com/zh-cn/library/aa751852.aspx http://blog.csdn.net/hsg77/article/details/389 ...
- 教你用ps如何将图片、文字做出模糊斑驳的作旧效果
1.对图片的图层执行滤镜-风格化-扩散,选变亮优先. 2.选择画笔工具,在画笔选项里选择喷溅59像素,画笔大小我用的是100px,大家可以根据自己的情况自定义大小,前景设置为黑色. 3.在图章图层上方 ...
- spring入门1-IOC和DI
1.概述 1.1.简介 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Or ...
- windows2012安装django
第一步:下载python3.6.8或者到(https://www.python.org/downloads/release/python-368/)官网下载(Windows x86-64 execut ...
- 『Python』matplotlib初识
1. 核心原理 使用matplotlib绘图的原理,主要就是理解figure(画布).axes(坐标系).axis(坐标轴)三者之间的关系. 下面这幅图更详细: 以"美院学生张三写生画画&q ...