思路:斜率优化

提交:\(2\)次

错因:二分写挂

题解:

首先观察可知,



对于点\(f(X,Y)\),一定是由某个点\((1,p)\),先向下走,再向右下走。

并且有个显然的性质,若从\((1,p)\)向下走,则\(a[p]=min(a[i]),i\in [p,Y]\)(要不然直接从后面的更小的那个位置向下走,再向右下走)

还有一个显然的性质,若\(i<j\)且\(i\)比\(j\)更优,则\(a[i]>a[j]\)(上面的结论)

设\(s[i]=\sum_{j=i}^i a[j]\)

那么对于点\(f(X,Y)\)有\(ans=s[Y]-s[i]+a[i]*(X-Y+i),i\in [max(1,Y-X),Y]\)

这个式子是可以斜率优化的:\(s[i]-a[i]*i=(X-Y)*a[i]+s[Y]-ans\)

要最小化\(ans\),就是最大化\(s[Y]-ans\),所以我们用单调栈维护下降斜率(上凸包),每次先查找合法区间\(i\in [max(1,Y-X),Y]\),然后再在单调栈中二分斜率。

#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register int
using namespace std;
namespace Luitaryi {
template<class I> inline I g(I& x) { x=0;
register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
} const int N=1e5+10;
int n,m,a[N],s[N],stk[N],ans[N],t;
struct node {int x,y,p;
inline bool operator < (const node& that) const {return y<that.y;}
}b[N];
inline int getlim(int pos) {
R l=1,r=t; while(l<r) { R md=l+r>>1;
if(stk[md]<pos) l=md+1; else r=md;
} return l;
}
inline double calc(int i,int j) {return ((double)(s[i]-a[i]*i)-(double)(s[j]-a[j]*j))/(double)(a[i]-a[j]);}
inline void main() {
g(n); for(R i=1;i<=n;++i) g(a[i]),s[i]=s[i-1]+a[i];
g(m); for(R i=1;i<=m;++i) g(b[i].x),g(b[i].y),b[i].p=i;
sort(b+1,b+m+1); for(R i=1,j=1;i<=n;++i) {
while(t&&a[stk[t]]>=a[i]) --t;
while(t>1&&calc(stk[t],i)>=calc(stk[t-1],i)) --t;
stk[++t]=i; while(b[j].y==i&&j<=m) {
R l=getlim(b[j].y-b[j].x),r=t;
while(l<r) { R md=l+r>>1;
if(calc(stk[md],stk[md+1])<b[j].x-b[j].y) r=md;
else l=md+1;
} l=stk[l],r=b[j].y;
ans[b[j].p]=s[r]-s[l]+a[l]*(b[j].x-r+l); ++j;
}
} for(R i=1;i<=m;++i) printf("%d\n",ans[i]);
}
} signed main() {Luitaryi::main(); return 0;}

2019.08.12

88

51nod 1488 帕斯卡小三角 斜率优化的更多相关文章

  1. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  2. BZOJ 3437: 小P的牧场 斜率优化DP

    3437: 小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场 ...

  3. bzoj3437小P的牧场 斜率优化dp

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1542  Solved: 849[Submit][Status][Discus ...

  4. 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途

    斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ;   1<=j<i (O(n^2)暴力)这样一个式子,首 ...

  5. [小A与最大子段和][斜率优化dp+二分]

    链接:https://ac.nowcoder.com/acm/contest/545/A来源:牛客网题目描述 小A在网上看到了 "最大子段和" 问题的解法.第二天,小A向小B讲解了 ...

  6. 【BZOJ3437】小P的牧场 斜率优化

    [BZOJ3437]小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这 ...

  7. 【BZOJ3437】小P的牧场(动态规划,斜率优化)

    [BZOJ3437]小P的牧场(动态规划,斜率优化) 题面 BZOJ 题解 考虑暴力\(dp\),设\(f[i]\)表示强制在\(i\)处建立控制站的并控制\([1..i]\)的最小代价. 很显然,枚 ...

  8. 【bzoj3437】小P的牧场 斜率优化dp

    题目描述 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个 ...

  9. BZOJ3437:小P的牧场(斜率优化DP)

    Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制 ...

随机推荐

  1. kafka 集群环境搭建 java

    简单记录下kafka集群环境搭建过程, 用来做备忘录 安装 第一步: 点击官网下载地址 http://kafka.apache.org/downloads.html 下载最新安装包 第二步: 解压 t ...

  2. Python Threading 线程/互斥锁/死锁/GIL锁

    导入线程包 import threading 准备函数线程,传参数 t1 = threading.Thread(target=func,args=(args,)) 类继承线程,创建线程对象 class ...

  3. ASP.NET Core依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  4. ReactNative报错null is not an object (evaluating '_rngesturehandlermodule.default.direction')

    程序报错: null is not an object (evaluating 'rngesturehandlermodule.default.direction') 解决: react-native ...

  5. Axure总结

    https://blog.csdn.net/xlegendxblog/article/details/54378705 1.常用符号 2.箭头的绘制 3.绘制流程图基本要点:流程路径不要交叉 4.对复 ...

  6. c# 定义和调用索引器

  7. Java--8--新特性--Lambda

    java9 都出来了,我才开始接触到java8的新特性,有点脱节啊.. Lambda是一个匿名函数,可以理解为一段可以传递的代码,将代码像数据一样传递,下面是一个小例子. public class E ...

  8. Android NDK 同时编译多个模块

    |-test |---Android.mk |---Application.mk |---sub1 |------Android.mk |------main.c |---sub2 |------An ...

  9. 学习使用Django2 前台页面展示

    Django  2.1  python 3.7 创建一个虚拟环境 python  -m  venv  虚拟环境名称 进入虚拟环境 下载django pip install  django==2.1 创 ...

  10. 解决Hibernate validator抛出Ljavax/validation/ParameterNameProvider异常方法

    最近升级CAS Client4.0客户端Spring版本至Spring4.*以上,升级整合hibernate框架时,Hibernate validator 4.3.0.Final使用版本(从Hiber ...