题目

挺好的一道题

我们考虑把\(i\)作为选取的最大子段的结束位置,我们如何往前计算贡献呢

考虑一下这个乘上其在队列中的位置可以表示为这个数被算了多少次,而我们往前扩展一位当前已经被扩展的就会被计算一次

设\(s_i\)表示序列的前缀和

扩展一次

\[s_i-s_{i-1}
\]

再扩展一次

\[s_i-s_{i-1}+s_i-s_{i-2}
\]

发现如果我们往前算到第\(j\)项的话贡献就是

\[(i-j+1)\times s_i-\sum_{k=j-1}^{i-1}s_k
\]

如果对前缀和序列在求一个前缀和,得到一个\(S\)序列就变成了这个柿子

\[i\times s_i-s_ij+s_i-S_{i-1}+S_{j-2}
\]

发现只有

\[-s_ij+S_{j-2}
\]

会影响我们的决策,所以考虑让这一项最大就好了

\[b=-s_ij+S_{j-2}
\]

\[s_ij+b=S_{j-2}
\]

这不是标准的斜率式吗,把\((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与最大子段和的更多相关文章

  1. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  2. Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

    Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...

  3. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  4. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  5. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  6. LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】

    LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...

  7. loj2324 「清华集训 2017」小 Y 和二叉树

    https://loj.ac/problem/2324 太智障,一开始以为中序遍历的第一个点一定是一个叶子,想了个贪心.然而,手算了一下,第一个点都过不了啊. input 5 2 3 4 1 3 3 ...

  8. LOJ2324「清华集训 2017」小Y和二叉树

    题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...

  9. LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)

    哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...

随机推荐

  1. bzoj 2167: 公交车站

    Description Z市交通不发达,所有公交路线覆盖的边竟然一个环也不包含,甚至该市的公交路线有可能会分为几个互不连通的块,这可真是不可思议.有一天,你突然听到一条消息,说你的M个同学被困在了Z市 ...

  2. dozer 简单用法

    maven添加必要的库: <!-- https://mvnrepository.com/artifact/net.sf.dozer/dozer --> <dependency> ...

  3. c#中用DataView查询

    新人菜鸟 在开发一款软件,用到了 MyS中的 DataView 查询.查询后判断视图是否有返回值,找了好久,终于找到了他的 DataView XX.Count 参数. string table = S ...

  4. Mysql插入Emoji表情出错

    Caused by: java.sql.SQLException: Incorrect at com.mysql.jdbc.SQLError.createSQLException(SQLError.j ...

  5. HttpContext在多线程异步调用中的使用方案

    1.在线程调用中,有时候会碰到操作文件之类的功能.对于开发人员来说,他们并不知道网站会被部署在服务器的那个角落里面,因此根本无法确定真实的物理路径(当然可以使用配置文件来配置物理路径),他们唯一知道的 ...

  6. javascript下的arguments,caller,callee,call,apply示例及理解

    (参考:http://justcoding.iteye.com/blog/589111) Arguments  该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments ...

  7. hibernate下Session的获取方式

    Session是应用程序与数据库之间的一个会话,其重要性不言而喻.初学Hibernate,使用SessionFactory,老老实实地打开事务,提交,回滚,关闭session. 1.直接通过Sessi ...

  8. jQuery——子元素筛选器

    子元素筛选器 名称 :first-child JQ语法 jQuery( "selector:first-child" ) 说明 :first-child选择器用于匹配作为父元素的第 ...

  9. SQLServer导入大sql文件报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL。 (mscorlib)

    打开cmd执行(d:\script.sql为sql文件位置):  sqlcmd -S 127.0.0.1 -U sa -P sa -i d:\script.sql    From:https://ww ...

  10. 关于zepto 选择特定值的input 报错问题

    zepto 选择特定值的input  时,需要用单引号或双引号引用这个特定值 否则 报错