QWQ菜的真实。

首先来看这个题。

很显然能得到一个朴素的\(dp\)柿子

\[dp[i]=max(dp[i],dp[j]+(sum[i]-sum[j])^2)
\]

但是因为\(n\le 500000\),所以\(n^2\)一定是过不了的。

考虑应该怎么优化。

考虑什么时候存在一个\(j>k且j比k更优秀\)

\[dp[j]+(sum[i]-sum[j])^2<dp[k]+(sum[i]-sum[k])^2
\]

我们进行化简

\[2\times s[i] \times (s[j]-s[k]) > dp[j]+sum[j]^2-dp[k]-sum[k]^2
\]

由于权值都是正数,所以\(s[j]-s[k]>0\)

我们设\(f[x]=sum[x]^2+dp[x]\)

则上述柿子等于$$2\times s[i]>\frac{f[j]-f[k]}{s[j]-s[k]}$$

观察到右边这个柿子是一个斜率的形式。

我们可以直接用单调队列维护一个下凸壳。

对于每次插入一个点,运用叉积进行\(check\),保证斜率是单调不降的。

int chacheng(Point x,Point y)
{
return x.x*y.y-y.x*x.y;
}
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;
// if ((double)(k.y-j.y)/(double)(k.x-j.x)<(double)(j.y-i.y)/(double)(j.x-i.x)) return true;
//return false;
}
void push(Point x)
{
while (tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;
q[++tail]=x;
}

删除的话,只需要通过上面那个柿子,若存在\(q[head+1]比q[head]\)优秀,就弹出队首元素

void pop(int lim)
{
while (tail>=head+1 && (q[head+1].y-q[head].y)<=lim*(q[head+1].x-q[head].x)) head++;
}

剩下的就是\(dp\)部分

qwq因为一些奇奇怪怪的问题\(WA\)了一上午

xtbl

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
#define int 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 = 1e6+1e2;
struct Point{
int x,y;
};
Point q[maxn];
int dp[maxn];
int sum[maxn];
int val[maxn];
int n,m;
int head=1,tail=0;
int chacheng(Point x,Point y)
{
return x.x*y.y-y.x*x.y;
}
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;
// if ((double)(k.y-j.y)/(double)(k.x-j.x)<(double)(j.y-i.y)/(double)(j.x-i.x)) return true;
//return false;
}
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++;
}
signed main()
{
while (scanf("%lld%lld",&n,&m)!=EOF)
{
memset(q,0,sizeof(q));
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
head=1,tail=0;
//n=read();m=read();
for (int i=1;i<=n;i++) val[i]=read();
for (int i=1;i<=n;i++) sum[i]=sum[i-1]+val[i];
dp[0]=0;
push((Point){0,0});
for (int i=1;i<=n;i++)
{
pop(2ll*sum[i]);
dp[i]=q[head].y-q[head].x*q[head].x+m+(sum[i]-q[head].x)*(sum[i]-q[head].x);
push((Point){sum[i],dp[i]+sum[i]*sum[i]});
//cout<<i<<" "<<dp[i]<<" "<<q[head].x<<" "<<q[head].y<<" "<<head<<" "<<tail<<endl;
}
cout<<dp[n]<<"\n";
}
return 0;
}

hdu3507 斜率优化学习笔记(斜率优化+dp)的更多相关文章

  1. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...

  2. 学习笔记·斜率优化 [HNOI2008]玩具装箱

    \(qwq\)今天\(rqy\)给窝萌这些蒟蒻讲了斜率优化--大概是他掉打窝萌掉打累了吧顺便偷了\(rqy\)讲课用的图 \(Step \ \ 1\) 一点小转化 事实上斜率优化是专门用来处理这样一类 ...

  3. KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  4. 深挖计算机基础:Linux性能优化学习笔记

    参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...

  5. Pandas 性能优化 学习笔记

    摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...

  6. HIVE优化学习笔记

    概述 之前写过关于hive的已经有两篇随笔了,但是作者依然还是一枚小白,现在把那些杂七杂八的总结一下,供以后查阅和总结.今天的文章介绍一下hive的优化.hive是好多公司都在使用的东西,也有好多大公 ...

  7. 《Java程序性能优化》学习笔记 设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  8. mysql 学习笔记5-- 数据库优化

    ext4:(rw,noatime,nodiratime,nobarrier,data=ordered)xfs: (rw,noatime,nodiratim,nobarrier,logbufs=8,lo ...

  9. DP斜率优化学习笔记

    斜率优化 首先,可以进行斜率优化的DP方程式一般式为$dp[i]=\max_{j=1}^{i-1}/\min_{j=1}^{i-1}\{a(i)*x(j)+b(i)*y(j)\}$ 其中$a(j)$和 ...

随机推荐

  1. Go测试--main测试

    目录 简介 示例 简介 子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down.但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这 ...

  2. 解析ThreadPoolExecutor类是如何保证线程池正确运行的

    摘要:对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢? 本文分享自华为云社区<[高并发]通过源码深度解析ThreadPoo ...

  3. mycat《对应关系》

  4. element-ui 用 el-checkbox-group 做权限管理

    template <el-checkbox-group v-model="menu_ide" v-for="(item,index) in menu_idss&qu ...

  5. Spring事物入门简介及AOP陷阱分析

    转载请注明出处: https://www.cnblogs.com/qnlcy/p/15237377.html 一.事务的定义 事务(Transaction),是指访问并可能更新数据库中各种数据项的一个 ...

  6. 常见GDB命令

  7. 使用SQL SERVER存储过程实现历史数据迁移

    今天讲下软件开发中最常见的历史数据迁移方式.在讲迁移之前,先简单介绍下几个基本概念. 1.什么是历史数据迁移? 简单直白地说:就是将一些创建时间比较久而且不常用的历史数据,存储到另一个地方(可以是另一 ...

  8. PHP中使用if的时候为什么建议将常量放在前面?

    在某些框架或者高手写的代码中,我们会发现有不少人喜欢在进行条件判断的时候将常量写在前面,比如: if(1 == $a){ echo 111; } 这样做有什么好处呢?我们假设一个不小心的粗心大意,少写 ...

  9. php_excel导出

    1.下载PHPExcel工具 2.解压后放置位置:ThinkPHP\Extend\Vendor\PHPExcel\PHPExcel.php. 3.Common.php代码 public functio ...

  10. iOS之内存管理-字节对齐

    字节对齐 1 struct Mystruct1{ 2 char a; //1字节 3 double b; //8字节 4 int c; //4字节 5 short d; //2字节 6 }Mystru ...