bzoj 1010,1011
上次应某位同学的要求先把代码给贴上了,今天还是细细讲讲比较好
bzoj 1010: dp+斜率优化
首先dp的思路并不是太难想出来,直接给方程:f[i] = min{f[j-1] + (sum[i]-sum[j-1]+i-j-L)
上面的方程稍微做了一点优化,就是将求和改成了前缀和的方式,快一点。
但是一看n^2能过? 一看数据眼泪掉下来! so怎么办? 优化呗,然后就是今天的斜率咯。
什么叫斜率优化?其实个人觉得个人的理解的斜率优化还是跟斜率一点关系都没有,反正张老师给我讲的时候没有提及斜率的概念。那么这到底是一个怎样的优化呢?在dp中比较容易想到的是某一些状态可以用单调队列给直接排除,斜率优化也有这种思想在里面:
我们将这个方程中的min中的i的那部分提取出来,就会得到一个式子f[i] = min(f(j) + f(i)*g(j)) + g(i) 什么意思呢? 由于对于特定的i值,min中与i相关的量和常数都是无意义的,所以将它们可以合并,然后就会的得到一个如此的式子。然后对于j,k满足j < k的话,如果j的情况比k的情况更差,那么就会有f(j) + f(i)*g(j) < f(k) + f(i)*g(k) 就可以解一个方程得到:(f(j)-f(i))/g(k)-g(j) < f(i) 也就是到了某一i过后,j的状态可以不用了,舍掉就好。因为是满足j<k的那么,那么我们就用一个单调队列来维护之,将它近队,然后在每一个i对于下面的每一个状态和它的下一个的比较与i比关系(就是上面那个方程),如果结果小于i,那么就把队首踢掉。那么算出了一个i的最优后,我们就要把它给入队,然后我们考虑一个问题,对于队尾的两个元素j,k,和新加的i,如果上面那个运算出的最小值小于了i,k的运算最小值,那么队尾元素就被踢掉,然后继续比较。
吐槽一下,唯一有斜率的地方救只有方程那里了。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; typedef long long ll; const ll maxn = 50001;
ll N,L;
ll s[maxn]; ll q[maxn],f[maxn];
ll l,r; ll fi(ll i){
return s[i]+i-L;
} ll fj(ll j){
return s[j-1]+j;
} double S(ll j,ll k){
return (double)(f[j-1]-f[k-1]+fj(j)*fj(j)-fj(k)*fj(k))/(double)(fj(j)-fj(k));
} int main(){
//freopen("cs.in","r",stdin);
scanf("%lld%lld",&N,&L);
memset(s,0,sizeof(s));
for(ll i = 1; i <= N; i++){
ll tmp;
scanf("%lld",&tmp);
s[i] = s[i-1] + tmp;
}
memset(q,0,sizeof(q));
l = 0, r = 0;
q[0] = 1;
memset(f,0,sizeof(f));
for(ll i = 1; i <= N; i++){
while(l < r && S(q[l],q[l+1]) < 2*fi(i)) l++;
ll now = q[l];
f[i] = f[now-1]+(fi(i)-fj(now))*(fi(i)-fj(now));
while(l < r && S(q[r],q[r-1]) > S(i+1,q[r])) r--;
q[++r] = i+1;
}
printf("%lld",f[N]);
return 0;
}
1011:
水题。。一看n^2要爆,然后误差小于5%。。也就是说允许误差,那么我们可以把几项认为位于同一位置,然后维护前缀和。。下面的代码中包含一个非常不严谨的误差保证,记住一点就是合并的时候一定要去中间的点作为合并的位置,不要取两端的!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxN = 100001;
const double eps = 1e-7; int n;
double m[maxN],sum[maxN];
double a; int main(){
//freopen("cs.in","r",stdin);
scanf("%d%lf",&n,&a);
memset(sum,0,sizeof(sum));
for(register int i = 1; i <= n; i++){
scanf("%lf",&m[i]);
sum[i] = sum[i-1] + m[i];
int maxn = (int)floor(a*i+eps),len;
double ans = 0;
while(maxn){
len = (int)floor((i-maxn)*0.05)+1;
if(maxn < len) len = maxn;
ans += (double)(sum[maxn]-sum[maxn-len])/(i-maxn+i-maxn+len-1)*2;
maxn -= len;
}
printf("%.6lf\n",ans*m[i]);
}
return 0;
}
bzoj 1010,1011的更多相关文章
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9330 Solved: 3739 Descriptio ...
- bzoj 1010 玩具装箱toy -斜率优化
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- 【斜率DP】BZOJ 1010:玩具装箱
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7537 Solved: 2888[Submit][St ...
- bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7874 Solved: 3047[Submit][St ...
- BZOJ 1010 [HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7184 Solved: 2724[Submit][St ...
- BZOJ 1010: [HNOI2008]玩具包装toy
职务地址:http :// www . lydsy . com / JudgeOnline / problem . php ? id = 1010 题目大意:见原题. 算法分析: 设s[i]为c[i] ...
- BZOJ 1010: [HNOI2008]玩具装箱toy(斜率优化dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k ...
随机推荐
- Nodejs base64编码与解码
1、普通字符串 //编码 new Buffer(String).toString('base64'); //解码 new Buffer(base64Str, 'base64').toString(); ...
- kubernetes报错
错误信息:执行yaml文件后,服务在运行,但是提示命令找不到 原因:没有环境,相当于只有一个快捷方式 环境目录为/usr/local/bin 解决办法:将/etc/ansible/bin下的文件都拷贝 ...
- Android 如何使edittext默认失去焦点
1.在布局文件中给edittext的父控件增加两个属性 android:focusable="true" android:focusableInTouchMode="tr ...
- leetcode-163周赛-1260-二维网格迁移
题目描述: 自己的提交: class Solution: def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int] ...
- 赋能时空云计算,阿里云数据库时空引擎Ganos上线
随着移动互联网.位置感知技术.对地观测技术的快速发展,时空信息已从传统GIS行业渗透到大众应用及各行各业.从静态POI(兴趣点)到APP位置信息,从导航电子地图到车辆行驶轨迹,从卫星影像到三维城市建模 ...
- HZOI2019SF
Simulation Final 坑.下午我要爆零(RP++) upd: 哈哈哈哈哈哈哈哈哈哈我真的爆零了哈哈哈哈哈哈哈哈哈哈 关于细节, T1A了但是和T3交反了哈哈哈哈哈哈哈哈哈哈 我说我真的不是 ...
- jQuery选择器 (详解)
1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $(" ...
- STM32嵌入式开发学习笔记(一)
本文中,笔者将介绍使用嵌入式开发工具Keil uVision5,使用C语言,对微处理器STM32F103C8进行嵌入式开发. 开发使用C语言,首先需要新建一个C语言文件,将其设为主函数的入口,因此,将 ...
- PHP面试 PHP基础知识 七(文件及目录处理)
文件操作 文件打开函数 fopen()函数 //用来打开一个文件 打开时需要指定打开模式 语法:fopen( filename, mode, include_path, context); filen ...
- IDEA上传项目到SVN
1.打开IDEA ,上面工具栏选择VCS 选择把项目交给SVN管理 2.选择SVN 3.选择SVN管理后可以看到项目变这个颜色 4.右键项目选择如下 5.点击绿色的+号,选择一个SVN仓库的地址,下面 ...