「Newcoder练习赛40D」小A与最大子段和
挺好的一道题
我们考虑把\(i\)作为选取的最大子段的结束位置,我们如何往前计算贡献呢
考虑一下这个乘上其在队列中的位置可以表示为这个数被算了多少次,而我们往前扩展一位当前已经被扩展的就会被计算一次
设\(s_i\)表示序列的前缀和
扩展一次
\]
再扩展一次
\]
发现如果我们往前算到第\(j\)项的话贡献就是
\]
如果对前缀和序列在求一个前缀和,得到一个\(S\)序列就变成了这个柿子
\]
发现只有
\]
会影响我们的决策,所以考虑让这一项最大就好了
设
\]
\]
这不是标准的斜率式吗,把\((j,S_{j-2})\)看成点,\(s_i\)看成斜率找到一个最优决策点就好了
自然凸壳上二分斜率了
第一次写这个东西,细节不少
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 200005
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
LL s[maxn],pre[maxn];
LL ans=0;
int q[maxn],h=1,t,n;
inline LL X(int i) {return (LL)i;}
inline LL Y(int i) {return pre[((i-2)>0)?(i-2):0];}
inline double K(int a,int b) {
if(X(a)==X(b)) return 9999999999;
return (double)(Y(a)-Y(b))/(double)(X(a)-X(b));
}
inline void ins(int x) {
while(h<t&&K(q[t-1],q[t])<K(q[t-1],x)) t--;
q[++t]=x;
}
inline int find(LL x) {
if(h==t) return q[t];
if(h==t-1) {
if(K(q[h],q[t])<x) return q[h];
return q[t];
}
int l=h,r=t;
while(l<=r) {
if(l==r-1) {
if(K(q[l],q[r])<x) return q[l];
return q[r];
}
int mid=l+r>>1;
if(mid+1>r) break;//细节1
if(K(q[mid],q[mid+1])<x) r=mid;//细节2,不能将mid排除,这样在终止条件的时候就计算不到了
else l=mid+1;
}
return q[t];
}
int main()
{
scanf("%d",&n);
for(re int i=1;i<=n;i++) scanf("%lld",&s[i]);
for(re int i=1;i<=n;i++) s[i]+=s[i-1];
for(re int i=1;i<=n;i++) pre[i]=pre[i-1]+s[i];
ins(1);ans=s[1];
for(re int i=2;i<=n;i++) {
ins(i);int x=find(s[i]);
ans=max(ans,(LL)(i+1)*s[i]-s[i]*x-pre[i-1]+pre[((x-2)>0)?(x-2):0]);
}
printf("%lld\n",ans);
return 0;
}
「Newcoder练习赛40D」小A与最大子段和的更多相关文章
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏
Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...
- loj2324 「清华集训 2017」小 Y 和二叉树
https://loj.ac/problem/2324 太智障,一开始以为中序遍历的第一个点一定是一个叶子,想了个贪心.然而,手算了一下,第一个点都过不了啊. input 5 2 3 4 1 3 3 ...
- LOJ2324「清华集训 2017」小Y和二叉树
题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...
- LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...
随机推荐
- html和css入门 (三)
文本样式 color 文本颜色 属性名 color 属性值 预定义的颜色名 | 十六进制值的颜色值 | RGB颜色值 默认值 依赖用户代理 描述 设置文本的颜色 direction 文本方向( 属性名 ...
- java.util.Collections.unmodifiableMap 示例
1. 概述 public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) ...
- 前端之body标签中相关标签(一)
一 字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub& ...
- webpack 启动 vue
右击 package.json 单击show npm Scripts
- 基础架构之Maven私有库
Maven对于Java开发来说肯定不会陌生,由于各种问题,公司常常需要搭建自己的私有Maven仓库. (一) 环境要求 Centos 7.5.1804 Docker 18.06.1-ce sonat ...
- 116.001 - 爱折腾之用 Kindle 读学术论文是什么体验?
@(116 - Kindle 使用指南) 结论先行 - 强烈安利k2pdfopt,把双栏论文转成kindle友好的pdf 整理转载自知乎@ wei huang 双栏学术论文在6寸屏上看就是个坑 新买的 ...
- ToolBar 简单使用
ToolBar 简单使用 ToolBar 是在 android 5.0之后推出的一款用来替代 ActionBar 的 View.ActionBar 是Activity的一部分,不能用在其他视图层次上( ...
- idea 多项目部署碰到的问题
在使用idea部署多个maven项目的时候,出现了各种坑.一天的时间有一半的时间花在了部署环境.运行环境上.把遇到的坑记录下 1.引入maven的依赖包 当项目多的时候,为了加速项目的开发,习惯性的把 ...
- Junit 报错: Failed to load ApplicationContext
今天在使用Junit测试时候,报了个错误: Failed to load ApplicationContext, aspect not found;挺奇怪的 我又没有调用你,之前还好好的,现在不能使用 ...
- php遍历数组赋值
<?php $arr=array( array("num"=>100,"name"=>"Liuxy","scor ...