牛客练习赛 小A与最大子段和 解题报告
小A与最大子段和
题意
在一个序列 \(\{a\}\) 里找到一个非空子段 \(\{b\}\), 满足 \(\sum\limits_{i=1}^{|b|}b_i\times i\) 最大
\(n\le 200000,|a_i|\le 2000\)
长的都一脸的斜率优化
考虑表示一个子段\([l+1,r]\)为
&\sum_{i=l+1}^ra_i(i-l)\\
&=\sum_{i=l+1}^ra_i\times i-a_i\times l
\end{aligned}
\]
设\(A_k=\sum_{i=1}^k a_ii,B_k=\sum_{i=1}^k a_i\)
那继续化简为
\]
然后我们枚举\(r\),想办法搞一下\(l\)
维护一个\((i,B_i\times i-A_i)\)的上凸包,然后发现是对斜率询问最大截距,直接在凸包上三分就可以了。
Code:
#include <cstdio>
#include <algorithm>
#define ll long long
const int N=2e5+10;
using std::max;
int n,tot;
ll A[N],B[N];
struct Point
{
ll x,y;
Point(){}
Point(ll X,ll Y){x=X,y=Y;}
Point friend operator -(Point a,Point b){return Point(a.x-b.x,a.y-b.y);}
ll cal(ll d){return d*x+y;}
}s[N];
ll Cross(Point a,Point b){return a.x*b.y-a.y*b.x;}
void ins(Point a)
{
while(tot>1&&Cross(a-s[tot],s[tot]-s[tot-1])<=0) --tot;
s[++tot]=a;
}
int main()
{
scanf("%d",&n);
ins(Point(0,0));
ll ans=-(1ll<<50),a;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a);
A[i]=A[i-1]+a*i;
B[i]=B[i-1]+a;
int l=1,r=tot;
while(l<r)
{
int mid=l+r>>1;
if(s[mid].cal(-B[i])<s[mid+1].cal(-B[i])) l=mid+1;
else r=mid;
}
ans=max(ans,A[i]+s[l].cal(-B[i]));
ins(Point(i,B[i]*i-A[i]));
}
printf("%lld\n",ans);
return 0;
}
2019.2.16
牛客练习赛 小A与最大子段和 解题报告的更多相关文章
- 牛客练习赛 小D的剑阵 解题报告
小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...
- 牛客练习赛 小A与任务 解题报告
小A与任务 链接: https://ac.nowcoder.com/acm/contest/369/B 来源:牛客网 题目描述 小A手头有 \(n\) 份任务,他可以以任意顺序完成这些任务,只有完成当 ...
- 牛客练习赛 小D的Lemon 解题报告
小D的Lemon 题意 已知 \[ g(x)=\left\{\begin{matrix} 1&,x=1\\ \sum_{i=1}^qk_i&,otherwise \end{matrix ...
- 牛客 545A 小A与最大子段和 & CF 660F Bear and Bowling 4
大意: 给定序列$a$, 求选择一个子区间$[l,r]$, 使得$\sum\limits_{i=l}^r(i-l+1)a_i$最大. $n\le2e5, |a_i|\le 1e7$. 记$s[i]=\ ...
- nowcoder(牛客网)提高组模拟赛第一场 解题报告
T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...
- nowcoder(牛客网)普及组模拟赛第一场 解题报告
蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- 牛客练习赛44 A 小y的序列 (模拟,细节)
链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
随机推荐
- .net获取excel表的内容(OleDB方法)
首先引用组件和命名空间 using Microsoft.Office.Interop.Excel; using System.Data.OleDb; 然后把excel上传到指定路径 上传文件方法省略 ...
- mysql 常用的几个函数
IF 函数 语法:`IF`(expr1,expr2,expr3); 当expr1为ture时,值为expr2,当expr1为false时,值为expr3. 如: IFNULL 函数 语法:IFNULL ...
- python第二周。2019.4.13
1, 我绘制大蟒蛇就是..保存也对着呢,你要是打开文件的话,先闪个黑屏,再闪个白屏..自动退出,然后啥都没了. 我觉得是我代码编错了...再来一遍! 这次到可以,但是这个大蟒蛇好像没有回头... 刚才 ...
- 并行编程(Parallel Framework)
前言 并行编程:通过编码方式利用多核或多处理器称为并行编程,多线程概念的一个子集. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.多线程的一种. 并行编程分为如下几个结构: 1 ...
- webpack教程(五)——图片的加载
首先安装的依赖 npm install file-loader --save-devnpm install image-webpack-loader --save-devnpm install url ...
- Object-Oriented(一)创建对象
自用备忘笔记 前言 虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦.为解决这个问题,人们开始使用工厂模式的变种. 工厂模式 function person(n ...
- Unity接入Steamworks
一.将scrpts/Steamworks.net/SteamManager组件添加到游戏物体上 二.修改SteamManager的代码为游戏的id如图所示 三.Unity,打开项目根目录,修改stea ...
- GlusterFS分布式存储数据的恢复机制(AFR)的说明
GlusterFSFS恢复数据都是基于副本卷来说的,GlusterFSFS复制卷是采用镜像的方式做的,并且是同步事务性操作.简单来说就是,某一个客户要写文件时,先把这个文件锁住,然后同时写两个或多个副 ...
- Oracle数据库冷备份与热备份操作梳理
Oracle数据库的备份方式有冷备份和热备份两种,针对这两种备份的实施过程记录如下: 一.Oracle冷备份 概念数据库在关闭状态下完成所有物理系统文件拷贝的过程,也称脱机备份.适合于非归档模式(即n ...
- 个人博客作业_week3
一. 评测 1.对方背景 这个好像大家都不一样,他要考四级啊,考六级啊,出国啊,或者平时写代码看不懂错误信息(呵呵)(还有可能是为了完成某次作业而用的....), 等等,所以是会用的.一般的问题都能解 ...