题目

挺好的一道题

我们考虑把\(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. group by 语句

    user E_book go 这样的程序会出错,因为play没有使用sum,所以要分组. group by play 有函数的和没有函数的表一起使用要用 GROUP BY .AVG 求平均值,只能与数 ...

  2. Java - 让1+1的结果变成3

    原出处是国外某论坛某帖子中楼主提问:如何让1+1=3?于是出现了各种语言实现的各种机制的答案,当然其中也包括直接用字符串输出"1+1=3"...最后被采纳的是用Java语言实现的答 ...

  3. mycat核心概念

    一.逻辑库(schema) 业务人员一般是不需要知道数据库中间件的,他们只需要连接到数据库并使用数据库,一切复杂的细节都被中间件给隐藏了,对于业务人员来说中间件即是一个数据库.这里逻辑库的概念就是一个 ...

  4. Java 基础(8)——流程控制

    上次的运算符都消化好了吗?每一天都要用到一些哦~ 以前有提到过一嘴,程序执行都是从上到下执行的,emm,学到这里,感觉这句话是对的也是错的了…… 如果都是一行一行执行下去的话,上节课的例子: 今天不上 ...

  5. VS编译优化

    程序的调试是任何一个程序必做的“功课”,当然在调试的过程中肯定会或多或少的遇到一些问题.如果每次关掉,修改,然后在启动,浪费不少时间和经历,尤其是在不确定的情况下尝试修改,启动的次数会更多.如果你要调 ...

  6. jquery居中窗口-页面加载直接居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 手贱--npm 误改全局安装路径

    修改全局安装命令: 通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefix 来获取当前设置的目录. 我的node ...

  8. php动态链接扩展库

    文章来源:http://keping.me/php-call-so/ PHP调用C/C++动态链接库 David June 19, 2013 C++, Linux, Study 摘要 有时候,单纯依靠 ...

  9. iview框架modal中嵌套modal

    modal的使用是平级的,后面的会覆盖前面,如下<modal>111</modal><modal>222</modal>内容为222的弹框会在内容为11 ...

  10. SharePoint 2013 - REST API about Security

    1. 获取当前用户信息(current user): var currentUserInfo = "{0}/_api/Web/CurrentUser"; // {0} -> ...