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. mysql主要的两个索引Innodb和MyIASM。

    参考:https://www.cnblogs.com/xiaohaillong/p/6079551.html 1. a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持.并且还提供了 ...

  2. etcd学习(8)-etcd中Lease的续期

    etcd中的Lease 前言 Lease Lease 整体架构 key 如何关联 Lease Lease的续期 过期 Lease 的删除 checkpoint 机制 总结 参考 etcd中的Lease ...

  3. 数据库CPU 100%处理记录

    问题描述 2020年7月13日一大早收到告警,测试环境数据库CPU告警. 登录aws查看监控如下图   问题分析 出现这种cpu 100%的问题,都是因为sql性能问题导致的, 主要表现于 cpu 消 ...

  4. freemodbus移植、实例及其测试方法

    Modbus简介 参考:Modbus​协议​深入​讲解 https://www.ni.com/zh-cn/innovations/white-papers/14/the-modbus-protocol ...

  5. DHCP的原理和配置

    前言 在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数.如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网络参数,还有可能会造成 IP地址冲突等问题.使用动态主机配置协议DHC ...

  6. ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】

    承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似 ...

  7. SQL Server Management Studio --- SSMS语言更换

    问题描述 在安装了En版后,想更换为中文版,但换了中文安装源还是英文. 解决方法 运行 SQL Server Management Studio 通过菜单选择你想要使用的语言: 中文版:"工 ...

  8. 分布式必备理论基础:CAP和BASE

    大家好,我是老三,今天是没有刷题的一天,心情愉悦,给大家分享两个简单的知识点:分布式理论中的CAP和BASE. CAP理论 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,Consi ...

  9. 洛谷P1088——火星人(全排列+数学模拟)

    题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...

  10. 数据结构逆向分析-List

    数据结构逆向分析-List 首先STL中的List就是一个链表,但是肯定C++用了很多封装,所以这里我们来一探究竟. 开始 首先先写一些简单的分析的源代码: #include<iostream& ...