P3195 [HNOI2008]玩具装箱 题解

我数学好弱啊,这种题都能卡
f i f_i fi为压缩完1~i的玩具的最优解,不难列出状态转移方程:
f i = min ⁡ { f j + [ q i − q j + i − ( j + 1 ) − L ] 2 } ( j < i ) f_i=\min\{f_j+[q_i-q_j+i-(j+1)-L]^2\}(j<i) fi=min{fj+[qiqj+i(j+1)L]2}(j<i),其中 q i = ∑ k = 1 i C k q_i=\sum_{k=1}^iC_k qi=k=1iCk
明显是 O ( n 2 ) O(n^2) O(n2)的式子, n ≤ 5 e 4 n \le 5e4 n5e4这种数据肯定过不去。
就要用到一些奇怪的优化了,比如斜率优化。
s i = q i + i s_i=q_i+i si=qi+i L ′ = L + 1 L'=L+1 L=L+1
f i = min ⁡ { f j + [ ( s i − s j ) − L ′ ] 2 } ( j < i ) f_i=\min\{f_j+[(s_i-s_j)-L']^2\}(j<i) fi=min{fj+[(sisj)L]2}(j<i)
现在有两个数 j , k j,k j,k,满足 i > j > k i>j>k i>j>k,令状态 k k k优于状态 j j j,得
f k + ( s i − s k − L ′ ) 2 ≤ f j + ( s i − s j − L ′ ) 2 遇 见 式 子 直 接 拆 , 得 f k + [ s i − ( s k + L ′ ) ] 2 ≤ f j + [ s i − ( s j + L ′ ) ] 2 f k + s i 2 − 2 s i ( s k + L ′ ) + ( s k + L ′ ) 2 ≤ f j + s i 2 − 2 s i ( s j + L ′ ) + ( s j + L ′ ) 2 化 简 , 得 f k − 2 s i ( s k + L ′ ) + ( s k + L ′ ) 2 ≤ f j − 2 s i ( s j + L ′ ) + ( s j + L ′ ) 2 把 有 s i 项 的 移 到 一 起 , 得 − 2 s i ( s k + L ′ ) + 2 s i ( s j + L ′ ) ≤ − f k + f j − 2 s i ( s j + L ′ ) + 2 s i ( s k + L ′ ) − ( s k + L ′ ) 2 + ( s j + L ′ ) 2 两 边 都 乘 − 1 , 得 2 s i ( s k + L ′ ) − 2 s i ( s j + L ′ ) ≤ f k − f j + 2 s i ( s k + L ′ ) − 2 s i ( s k + L ′ ) + ( s k + L ′ ) 2 − ( s j + L ′ ) 2 s i [ 2 ( s k + L ′ ) − 2 ( s j + L ′ ) ] ≤ f k − f j + 2 s i ( s k + L ′ ) − 2 s i ( s k + L ′ ) + ( s k + L ′ ) 2 − ( s j + L ′ ) 2 s i ≤ f k − f j + 2 s i ( s k + L ′ ) − 2 s i ( s k + L ′ ) + ( s k + L ′ ) 2 − ( s j + L ′ ) 2 2 ( s k + L ′ ) − 2 ( s j + L ′ ) 设 X i = 2 s i , Y i = f i + ( s i + L ′ ) 2 得 s i ≤ Y k − Y j X k − X j 嗯 , 这 么 眼 熟 , 高 中 书 上 的 斜 率 ? f_k+(s_i-s_k-L')^2 \le f_j+(s_i-s_j-L')^2\\ 遇见式子直接拆,得f_k+[s_i-(s_k+L')]^2 \le f_j+[s_i-(s_j+L')]^2\\ f_k+s_i^2-2s_i(s_k+L')+(s_k+L')^2 \le f_j+s_i^2-2s_i(s_j+L')+(s_j+L')^2\\ 化简,得f_k-2s_i(s_k+L')+(s_k+L')^2 \le f_j-2s_i(s_j+L')+(s_j+L')^2\\ 把有s_i项的移到一起,得-2s_i(s_k+L')+2s_i(s_j+L') \le -f_k+f_j-2s_i(s_j+L')+2s_i(s_k+L')-(s_k+L')^2+(s_j+L')^2\\ 两边都乘-1,得2s_i(s_k+L')-2s_i(s_j+L') \le f_k-f_j+2s_i(s_k+L')-2s_i(s_k+L')+(s_k+L')^2-(s_j+L')^2\\ s_i[2(s_k+L')-2(s_j+L')] \le f_k-f_j+2s_i(s_k+L')-2s_i(s_k+L')+(s_k+L')^2-(s_j+L')^2\\ s_i \le \frac{ f_k-f_j+2s_i(s_k+L')-2s_i(s_k+L')+(s_k+L')^2-(s_j+L')^2}{2(s_k+L')-2(s_j+L')}\\ 设X_i=2s_i,Y_i=f_i+(s_i+L')^2\\ 得 s_i \le \frac{Y_k-Y_j}{X_k-X_j}\\ 嗯,这么眼熟,高中书上的斜率?\\ fk+(siskL)2fj+(sisjL)2fk+[si(sk+L)]2fj+[si(sj+L)]2fk+si22si(sk+L)+(sk+L)2fj+si22si(sj+L)+(sj+L)2fk2si(sk+L)+(sk+L)2fj2si(sj+L)+(sj+L)2si2si(sk+L)+2si(sj+L)fk+fj2si(sj+L)+2si(sk+L)(sk+L)2+(sj+L)212si(sk+L)2si(sj+L)fkfj+2si(sk+L)2si(sk+L)+(sk+L)2(sj+L)2si[2(sk+L)2(sj+L)]fkfj+2si(sk+L)2si(sk+L)+(sk+L)2(sj+L)2si2(sk+L)2(sj+L)fkfj+2si(sk+L)2si(sk+L)+(sk+L)2(sj+L)2Xi=2si,Yi=fi+(si+L)2siXkXjYkYj
图片来源:原题luogu题解

可以发现 s i s_i si是单调上升的,然后非常simple画个图像(直接到洛谷上去找吧),发现是下凸包,我们只要找第一个 s l o p e ( P j , P j + 1 ) > s i slope(P_j,P_{j+1})>s_i slope(Pj,Pj+1)>si的点,那么既可以用二分 O ( n l o g n ) O(nlogn) O(nlogn),也可以用单调队列 O ( n ) O(n) O(n),不过需要四边形不等式证明一下(口胡?不会),GG。
好像就结束了啊,放个代码:

# include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,L;
long long q[N];
long long dp[N];
int Q[N<<2];
int front,rear;
long long sq(long long x) {return x*x;}
long long X(int i) 
{
	return 2.0*q[i];
}
long long Y(int i) 
{
	return (dp[i])+sq((q[i])+(L+1));
}
long double slope(int i,int j) 
{
	return (long double)(Y(j)-Y(i))/(X(j)-X(i));
}
int main(void) 
{
	scanf("%d%d",&n,&L);
	long long x;
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&x);
		q[i]=q[i-1]+x+1;
	}
	front=rear=0;
	Q[++rear]=0;
	for(int i=1;i<=n;i++) 
	{
		while(front+1<rear&&slope(Q[front+1],Q[front+2])<=q[i]) front++;
		int head=Q[front+1];
		dp[i]=dp[head]+sq(q[i]-q[head]-L-1);
		while(front+1<rear&&slope(Q[rear-1],i)<slope(Q[rear],Q[rear-1])) rear--;
		Q[++rear]=i;
	}
	cout<<dp[n]<<endl;
	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面只是目标目录 ├─第1章-Shiro权限实战课程介绍 │ 1-1Shiro权限实战课程介绍.mp4 │ 1-2权限控制和初学JavaWeb处理访问权限控制.mp4 │ ├─第2章-大话权限框架核心知识ACL和RBAC │ 2-1权限框架设计之ACL和RBAC讲解.mp4 │ 2-2主流权限框架介绍和技术选型讲解.mp4 │ ├─第3章-ApacheShiro基础概念知识和架构讲解 │ 3-1Shiro核心知识之架构图交互和四大模块讲解.mp4 │ 3-2用户访问Shrio权限控制运行流程和常见概念讲解.mp4 │ ├─第4章-Springboot2.x整合ApacheShiro快速上手实战 │ 4-1SpringBoot2.x整合Shiro.mp4 │ 4-2快速上手之Shiro认证和授权流程实操上集.mp4 │ 4-3Shiro认证和授权流程和常用API梳理下集.mp4 │ ├─第5章-详细讲解ApacheShirorealm实战 │ 5-1Shiro安全数据来源之Realm讲解.mp4 │ 5-2快速上手之Shiro内置IniRealm实操.mp4 │ 5-3快速上手之Shiro内置JdbcRealm实操.mp4 │ 5-4ApacheShiro自定义Readl实战.mp4 │ 5-5深入Shiro源码解读认证授权流程.mp4 │ ├─第6章-Shiro权限认证Web案例知识点讲解 │ 6-1Shiro内置的Filter过滤器讲解.mp4 │ 6-2Shiro的Filter配置路径讲解.mp4 │ 6-3Shiro数据安全之数据加解密.mp4 │ 6-4Shiro权限控制注解和编程方式讲解.mp4 │ 6-5Shiro缓存模块讲解.mp4 │ 6-6ShiroSession模块讲解.mp4 │ ├─第7章-ApacheShiro整合SpringBoot2.x综合案例实战 │ 7-10使用ShiroLogout和加密处理.mp4 │ 7-1Shiro整合SpringBoot2.x案例实战介绍.mp4 │ 7-2基于RBAC权限控制实战之Mysql数据库设计.mp4 │ 7-3SpringBoot2.x项目框架和依赖搭建.mp4 │ 7-4案例实战之权限相关服务接口开发.mp4 │ 7-5案例实战之用户角色权限多对多关联查询SQL.mp4 │ 7-6案例实战自定义CustomRealm实战.mp4 │ 7-7项目实战之ShiroFilterFactoryBean配置实战.mp4 │ 7-8前后端分离自定义SessionManager验证.mp4 │ 7-9API权限拦截验证实战.mp4 │ ├─第8章-权限控制综合案例实战进阶 │ 8-1实战进阶之自定义ShiroFilter过滤器上集.mp4 │ 8-2实战进阶之自定义ShiroFilter过滤器下集.mp4 │ 8-3性能提升之Redis整合CacheManager.mp4 │ 8-4性能提升之Redis整合SessionManager.mp4 │ 8-5ShiroConfig常用bean类配置.mp4 │ ├─第9章-大话分布式应用的鉴权方式 │ 9-1单体应用到分布式应用下的鉴权方式介绍.mp4 │ 9-2Shiro整合SpringBoot下自定义SessionId.mp4 │ ├─第10章-Shiro课程总结 │ 10-1Apacheshiro从入门到高级实战课程总结.mp4 │ 10-2高级工程师到架构师-解决问题思路+学习方法.mp4 │ └─课件资料.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值