思路:斜率优化

提交:\(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. heroku 的用法

    heroku 安装cli npm install -g heroku ubuntu 下 sudo snap install --classic heroku 安装 npm init -y heroku ...

  2. (十七)springMvc 对表单提交的日期以及JSON中的日期的参数绑定

    文章目录 前言 `Ajax`提交表单数据 `Ajax`提交`JSON` 格式数据 解决输出JSON乱码的问题 控制JSON输出日期格式 小记 前言 springMVC 提供强大的参数绑定功能,使得我们 ...

  3. Hello World详解

    Hello World 题目 [题目描述] 输出“Hello World!”(不输出“”). [输入格式] 啥都没有. [输出格式] Hello World! [数据规模] 输出就行了,管那么多干什么 ...

  4. STM32中引脚复用说明

    端口复用的定义 STM32有许多的内置外设(如串口.ADC.DCA等等),这些外设的外部引脚都是和GPIO复用的.也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设 ...

  5. littleFS在RT1052移植笔记

    环境:rt1052单片机+16G tf卡 为什么使用littleFS? NXP官方SDK支持! 先进的损耗平衡功能(wear leveling)可提供最长的快闪及内存寿命及最大的使用量.因为FALSH ...

  6. closed channel

    func Test_chanel(t *testing.T) { c := make(chan int, 1) go func() { time.Sleep(time.Second * 3) clos ...

  7. 网页修改<title ></title >标签内容

    document.title = 'xxxxxx';

  8. 怎样通过正则匹配IP地址

    Ipv4的地址是0.0.0.0 到 255.255.255.255, 匹配这个字段需要判断三种情况: 1. 如果第一位是0或1, 则第二位和第三位可以是0-9的任意数值: [01]\d\d 2. 如果 ...

  9. kafka的生产者配置以及发送信息的三种方式

    1.Fire-and-forget 这种方式是不管发送成功与否,客户端都会返回成功.尽管大多数的时候Kafka 在发送失败后,会自己重新自动再一次发送消息,但是也会存在丢失消息的风险 Producer ...

  10. element-ui上传一张图片后隐藏上传按钮

    来自:https://github.com/ElemeFE/element/issues/3367#issuecomment-376402380 侵删 el-upload里面绑定一个占位class: ...