链接:https://ac.nowcoder.com/acm/contest/545/A
来源:牛客网
题目描述

小A在网上看到了 "最大子段和" 问题的解法.第二天,小A向小B讲解了这个问题.
但小B抛出了一个疑问:如果让每个数的权值是它本身的值乘上它在子段中的位置呢?
小A被难住了,你能帮他解决这个问题吗?
形式化地说,你需要在一个序列 a  里找到一个非空子段(子段是连续的) b, 满足 ∑mi=1b[i]×i∑i=1mb[i]×i 最大( m 是 b 的长度)
输入描述:
第一行一个整数 n ,表示序列的长度
第二行 n 个整数,第 i 个数表示 aiai
输出描述:
一行一个整数,表示最大的 ∑mi=1b[i]×i∑i=1mb[i]×i 
示例1
输入
4
-100 1 2 3
输出
14

说明
1×1+2×2+3×3=141×1+2×2+3×3=14

备注:
1≤n≤2×10^5
0≤∣ai|≤2×10^3
题解:枚举每个区间右端点,如果再枚举左端点则复杂度为O(N^2)不可行。使用斜率优化。 令s为前缀和,p[i] = ∑(i * s[i]),区间[j, i]以i为右端点时区间和可以表示为p[i] - p[j - 1] - (j - 1) * (s[i] - s[j - 1])。 斜率方程(k < j < i) j比k优,((j * s[j] - p[j]) - (k * s[k] - p[k])) / (j - k) > s[i],由于前缀和s不单调所以不能直接将队首节点弹出,(即只通过插入当前点更新队尾元素,不能丢弃队首元素,【而如果前缀和s单调,易知队首元素在当前不满足时也不会满足以后的点即可以丢弃】)
所以就不能通过丢弃队首来找满足条件的点了,只能通过二分斜率凸包来找满足条件的斜率。
 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
#include<time.h>
using namespace std;
typedef long long ll;
const int N = 2e5+;
ll a[N],A[N],B[N],dp[N];
struct pot{
int x;
ll y;
}que[N];
int head=;
int tail=;
bool check(int s,int k){
if(tail<)return true;
return que[s].y-que[s-].y<(que[s].x-que[s-].x)*B[k];
}
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){scanf("%lld",&a[i]);dp[i]=a[i];}
for(int i=;i<=n;i++){
A[i]=i*a[i]+A[i-];
B[i]=a[i]+B[i-];
}
ll ans=-;
for(int i=;i<=n;i++){
int l=head;
int r=tail;
int m=l;
while(l<=r){
int mid=(l+r)/;
if(check(mid,i)){
m=mid;
r=mid-;
}
else l=mid+;
}
dp[i]=max(A[i]-A[que[m-].x]-que[m-].x*(B[i]-B[que[m-].x]),dp[i]);
ans=max(ans,dp[i]);
while(tail>=&&(i*B[i]-A[i]-(que[tail].y))*(que[tail].x-que[tail-].x)>(i-que[tail].x)*((que[tail].y-que[tail-].y)))tail--;
que[++tail].x=i;
que[tail].y=i*B[i]-A[i];
}
cout<<ans<<endl;
return ;
}
 
 

 

[小A与最大子段和][斜率优化dp+二分]的更多相关文章

  1. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  2. BZOJ2726【SDOI2012】任务安排(斜率优化Dp+二分查找)

    由题目条件显然可以得到状态 f[i][j] 表示以 i 为结尾且 i 后作为断点,共做了 j 次分组的最小代价. 因此转移变得很显然:f[i][j]=min{f[k][j-1]+(s×j+sumT[i ...

  3. 小A与最大子段和 斜率优化 + 二分 + 细节

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  4. 2018.09.05 bzoj2726: [SDOI2012]任务安排(斜率优化dp+二分)

    传送门 跟Ti" role="presentation" style="position: relative;">TiTi为正数的时候差不多. ...

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

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

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

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

  7. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  8. 蒟蒻关于斜率优化DP简单的总结

    斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...

  9. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

随机推荐

  1. python2x 与 python3x 区别

    python2.x 与 python3.x 的区别: 1. python2.x 的源码编码不规范,源码重复较多:python3.x 的源码编码规范,清晰.优美.简单 2. python2.x的默认字符 ...

  2. 3.python函数编程-reduce函数

    reduce将所有数据压缩到一起,得到一个最终的结果. 在python2中可以直接使用,在python3中需要导入 from functools import reduce 自己实现代码: num = ...

  3. .NetCore发布到Centos docker

    将.netcore mvc项目发布到centos7的docker中.环境 vmware14+Centos7+docker-ce 1.使用vs将.netcoremvc项目发布到本地,修改发布后的目录 名 ...

  4. Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)

    本篇项目地址,名字是AudioRecord录音(能暂停,将pch转换为wav),求starhttps://github.com/979451341/Audio-and-video-learning-m ...

  5. printf以%d形式输出浮点数的问题

    若运行时从键盘上输入9876543210l,则下面程序的输出结果是 int main(){ int a;float b,c; scanf("%2d%3f%4f",&a,&a ...

  6. UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. 浅谈Linux系统运维工程师必备技能

    一.什么是运维工程师 相信读者们必定听说过Linux,也听说过运维工程师.那么运维工程师是个什么概念呢? 百度百科上的官方解释如下: 运维工程师(Operations)在国内又称为运维开发工程师(De ...

  8. Oauth2.0:Access Token 与 Refresh Token

    access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因为,access token 在使用的过程中可能会泄露.给 a ...

  9. Codeforces Round #495 (Div. 2) B

    题目链接:http://codeforces.com/contest/1004/problem/B B. Sonya and Exhibition time limit per test 1 seco ...

  10. Python 基础的应用day2

    1 用户交互input,将用户输入的内容赋值给 name 变量 后只能是字符串str.      区别2和3: ps :python2:raw_input python3:input 例 :1 nam ...