hdu3507 斜率优化学习笔记(斜率优化+dp)
QWQ菜的真实。
首先来看这个题。
很显然能得到一个朴素的\(dp\)柿子
\]
但是因为\(n\le 500000\),所以\(n^2\)一定是过不了的。
考虑应该怎么优化。
考虑什么时候存在一个\(j>k且j比k更优秀\)
\]
我们进行化简
\]
由于权值都是正数,所以\(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)的更多相关文章
- 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
		
深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...
 - 学习笔记·斜率优化 [HNOI2008]玩具装箱
		
\(qwq\)今天\(rqy\)给窝萌这些蒟蒻讲了斜率优化--大概是他掉打窝萌掉打累了吧顺便偷了\(rqy\)讲课用的图 \(Step \ \ 1\) 一点小转化 事实上斜率优化是专门用来处理这样一类 ...
 - KVM性能优化学习笔记
		
本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...
 - 深挖计算机基础:Linux性能优化学习笔记
		
参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...
 - Pandas 性能优化 学习笔记
		
摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...
 - HIVE优化学习笔记
		
概述 之前写过关于hive的已经有两篇随笔了,但是作者依然还是一枚小白,现在把那些杂七杂八的总结一下,供以后查阅和总结.今天的文章介绍一下hive的优化.hive是好多公司都在使用的东西,也有好多大公 ...
 - 《Java程序性能优化》学习笔记 设计优化
		
豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...
 - mysql 学习笔记5-- 数据库优化
		
ext4:(rw,noatime,nodiratime,nobarrier,data=ordered)xfs: (rw,noatime,nodiratim,nobarrier,logbufs=8,lo ...
 - DP斜率优化学习笔记
		
斜率优化 首先,可以进行斜率优化的DP方程式一般式为$dp[i]=\max_{j=1}^{i-1}/\min_{j=1}^{i-1}\{a(i)*x(j)+b(i)*y(j)\}$ 其中$a(j)$和 ...
 
随机推荐
- Java如何调用C语言程序,JNI技术
			
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
 - 4种Golang并发操作中常见的死锁情形
			
摘要:什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你.我俩都这么想,这事就解决不了了. 本文分享自华为云社区< ...
 - python json demo
			
值得注意的一点是,list类型的数据可以用[2,3]的方式定义,如"b" import json jsonData = '{"a":1,"b" ...
 - centos7 wget安装jdk
			
2021-07-151. 环境介绍 操作系统:centos7 jdk版本:jdk1.8.0.211 2. 下载 进入 https://www.oracle.com/java/technologies/ ...
 - 临时性备用 socks 巧(科)妙(学)上网,你懂的,不多解释
			
最近 Shadowsock s 不稳定,极大的影响了工作效率.不过 ssh 还能连上自己的机器,所以掏出 ssh -D 满足自己 #!/usr/bin/env bash disable_proxy() ...
 - https(ssl) 免费证书
			
https://letsencrypt.org/getting-started/ https://certbot.eff.org/lets-encrypt/centosrhel7-nginx http ...
 - Pytest 系列(29)- 详解 allure.dynamic 动态生成功能
			
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 @allure.title ...
 - tcpdump使用手册
			
tcp使用手册 格式: tcpdump [选项] [过滤条件] 选项: -i eth0 #网卡接口 -A #以ASCII码格式阅读 -w file #下载抓取的数据包 -r file #上传数据包 - ...
 - 深入xLua实现原理之Lua如何调用C#
			
xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...
 - HTML基本概念及基本标签
			
HTML基本概念及基本语法 1.HTML的基本概念 1.1 B/S.C/S基本概念 B/S(Browser/Server):指的是浏览器端与服务器端工作模式,优点相对节省本地存储空间,不足是需要占用 ...