Link

我们设\(f_{i,j}\)表示前\(i\)个数中选\(j\)个的最大值。

那么显然有\(f_{i,j}=max(f_{i-1,j},f_{i-1,j-1}+j*a_i)\)。

这个东西我们首先可以把它的第一维给滚掉。

然后我们知道这是个\(O(n^2)\)的东西,所以要考虑优化。

有一个结论是\(\forall i\in[1,n],\exist k\in[1,i],s.t.\forall j\in[0,k),f_{i,j}=f_{i-1,j},\forall j\in[k,i],f_{i,j}=f_{i-1,j-1}+j*a_i\)

这个东西感性理解一下吧,就是你前面选的越多,选\(a_i\)时可能产生的贡献就越大。

具体证明上洛谷题解里面找吧。

那么我们每次可以把\(k\)二分出来,然后就相当于在原序列的\(f_{k-1},f_k\)之间再插一个\(f_k\)进去,后面的\(f_j\)加上一个等差数列\(a_i*j\)。

这个东西可以用平衡树来做。

#include<bits/stdc++.h>
#define lc ch[p][0]
#define rc ch[p][1]
#define ll long long
using namespace std;
int read(){int x;scanf("%d",&x);return x;}
ll max(ll a,ll b){return a>b? a:b;}
const int N=100007;
int fa[N],ch[N][2],s[N],n,root,cnt;ll A[N],B[N],val[N];
int isr(int x){return ch[fa[x]][1]==x;}
void pushup(int p){s[p]=s[lc]+s[rc]+1;}
void modify(int p,ll a,ll b){val[p]+=a*(s[lc]+1)+b,A[p]+=a,B[p]+=b;}
void pushdown(int p){ if(A[p]||B[p]) { if(lc) modify(lc,A[p],B[p]); if(rc) modify(rc,A[p],B[p]+A[p]*(s[lc]+1)); A[p]=B[p]=0; } }
void pushall(int x){if(fa[x])pushall(fa[x]);pushdown(x);}
void rotate(int x)
{
int y=fa[x],z=fa[y],k=isr(x);if(z)ch[z][isr(y)]=x;
fa[x]=z,fa[y]=x,fa[ch[x][!k]]=y,ch[y][k]=ch[x][!k],ch[x][!k]=y,pushup(y);
}
void splay(int x)
{
pushall(x);
for(;fa[x];rotate(x)) if(fa[fa[x]]) rotate((isr(x)^isr(fa[x]))? x:fa[x]);
pushup(root=x);
}
ll Kth(int k)
{
int p=root;
while(1)
if(k>s[lc]+1) k-=s[lc]+1,p=rc;
else if(s[lc]>=k) p=lc;
else return splay(p),val[p];
}
ll query(int p)
{
if(!p) return -1e18;
pushdown(p);
return max(val[p],max(query(lc),query(rc)));
}
int main()
{
n=read(),s[1]=root=cnt=1;int i,x,l,r,mid,ans;
for(i=1;i<=n;++i)
{
x=read(),l=0,r=i-2,ans=i-1;
while(l<=r){mid=l+r>>1;if(Kth(mid+1)+(mid+1ll)*x>Kth(mid+2))ans=mid,r=mid-1;else l=mid+1;}
Kth(ans+1),fa[++cnt]=root,fa[ch[root][1]]=cnt,ch[cnt][1]=ch[root][1],ch[root][1]=cnt,val[cnt]=val[root],modify(cnt,x,1ll*x*ans);
}
return !printf("%lld",query(root));
}

CF573E Bear and Bowling的更多相关文章

  1. CF573E Bear and Bowling 贪心、分块、凸包

    传送门 题解搬运工++ 先证明一个贪心做法的正确性:做以下操作若干次,每一次考虑选择没有被选到答案序列中的数加入到答案序列中对答案的贡献,设第\(i\)个位置的贡献为\(V_i\),如果最大的贡献小于 ...

  2. CF573E Bear and Bowling(6-1)

    题意 洛谷 做法一 考虑一种贪心(先别管对不对),设当前已选择的集合为\(A\),这是考虑该集合的补集,每个元素加进来后的增量为\(V_i\),则挑选最大的那个加入该集合 结论1:遵循上述贪心,\(\ ...

  3. 【CF573E】Bear and Bowling

    [CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times ...

  4. Codeforces 660F Bear and Bowling 4 斜率优化 (看题解)

    Bear and Bowling 4 这也能斜率优化... max[ i ] = a[ i ] - a[ j ] - j * (sum[ i ] - sum[ j ])然后就能斜率优化啦, 我咋没想到 ...

  5. CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)

    Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...

  6. 牛客 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]=\ ...

  7. DP的优化总结

    一.预备知识 \(tD/eD\) 问题:状态 t 维,决策 e 维.时间复杂度\(O(n^{e+t})\). 四边形不等式: 称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\l ...

  8. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  9. BUPT2017 wintertraining(16) #9

    龟速补题.目前基本弃坑.已暂时放弃 D.I 两题. 下面不再写题意了直接说解法注意事项之类,直接放contest链接. https://vjudge.net/contest/151537 A.The ...

随机推荐

  1. 使用 CSS 显示 XML

    通过使用 CSS,可为 XML 文档添加显示信息. 使用 CSS 显示您的 XML? 使用 CSS 来格式化 XML 文档是有可能的. 下面的例子就是关于如何使用 CSS 样式表来格式化 XML 文档 ...

  2. CF718C Sasha and Array 线段树 + 矩阵乘法

    有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$   直接求不好求,改成矩阵乘法的形式:  $a_{i}=M^x\times ...

  3. 洛谷 P1505 BZOJ 2157 [国家集训队]旅游

    bzoj题面 Time limit 10000 ms Memory limit 265216 kB OS Linux 吐槽 又浪费一个下午--区间乘-1之后,最大值和最小值更新有坑.新的最大值是原来最 ...

  4. 程序员心髓:移动应用API设计10大技巧

    移动App与基于Web/云服务发生对话是很常见的事情,最简单的可能仅仅只是检索数据,但也可能包含发送数据.用户授权和管理.而这也就验证了为移动应用建立API的重要性,为此,我们特总结了10大移动API ...

  5. 后盾网lavarel视频项目---1、数据迁移

    后盾网lavarel视频项目---1.数据迁移 一.总结 一句话总结: 1.lavarel的数据迁移比较简单,就是用php来创建数据表 2.创建迁移文件:php artisan make:migrat ...

  6. architecture 20190628

    https://abp.io/  --ABP v2 官网 https://grpc.io/ --gRPC官网 https://devblogs.microsoft.com/dotnet/introdu ...

  7. gdb调试知识

    之前一直不怎么用gdb,现在要用做一下记录 用gdb启动程序 gdb ./demo intel风格反汇编main函数,一共两行第一行设置汇编风格,第二行才是反汇编main函数 set disassem ...

  8. Python中的self用法之面向对象

    class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def ...

  9. linux 设置 hugepage

    临时设置 hugepage > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages 查看是否设置成功 cat /proc/meminf ...

  10. 设计模式(5): vue 不监听绑定的变量

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 绑定变量 一般情况下,如果我们需要在组件中使用某个变量,会这么使用: ...