正题

题目链接:http://noi.ac/problem/2139


题目大意

给出\(n\)个数字的序列\(a_i\)。然后选出一个不降子序列最大化子序列的\(a_i\)和减去没有任何一个数被选中的区间数量。

\(1\leq n\leq 10^6,1\leq a_i\leq 10^8\)


解题思路

嗯,考虑朴素的\(dp\)方程,设\(f_i\)表示以\(i\)为末尾的值就有

\[f_i=f_j+a_i+\frac{(i-j-1)(i-j)}{2}
\]

然后展开整理一下都乘二就是

\[f_i=f_j+2a_i+i^2-i+j^2+j-2ij(a_j\leq a_i,j<i)
\]

除了\(a_j\leq a_i\)就是一个标准的斜率优化式子了

然后这个东西其实挺好搞的,因为多一个限制直接上\(CDQ\)就好了,但是每次左边要归并排序,这样时间复杂度就是\(O(n\log n)\)的了

但其实还有更暴力的做法,因为既然一个\(CDQ\)能做到,那么找些数据结构之类的也肯定能做到。

对于树状数组上每个节点维护一个凸壳然后暴力查询就好了

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=1e6+10;
ll n,m,a[N],b[N],l[N],r[N],f[N],k[N];
vector<ll >q[N];
ll calc(ll i,ll j)
{return k[i]+2*i*j;}
void Change(ll x,ll i){
while(x<=m){
while(l[x]<r[x]&&(k[i]-k[q[x][r[x]]])*(q[x][r[x]]-q[x][r[x]-1])>=(k[q[x][r[x]]]-k[q[x][r[x]-1]])*(i-q[x][r[x]]))
r[x]--,q[x].pop_back();
q[x].push_back(i);r[x]++;x+=lowbit(x);
}
return;
}
ll Ask(ll x,ll i){
ll ans=-1e18;
while(x){
while(l[x]<r[x]&&calc(q[x][l[x]],i)<calc(q[x][l[x]+1],i))
l[x]++;
if(l[x]<=r[x])ans=max(ans,calc(q[x][l[x]],i));
x-=lowbit(x);
}
return ans;
}
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
m=unique(b+1,b+1+n)-b-1;
for(ll i=1;i<=m;i++)r[i]=-1;
Change(1,0);
for(ll i=1;i<=n;i++){
ll x=lower_bound(b+1,b+1+m,a[i])-b;
f[i]=Ask(x,i)+2*a[i]-i*i+i;
k[i]=f[i]-i*i-i;
Change(x,i);
}
ll ans=-1e18;
for(ll i=1;i<=n;i++)
ans=max(ans,f[i]/2-(n-i+1)*(n-i)/2);
printf("%lld\n",ans);
return 0;
}

NOI.AC#2139-选择【斜率优化dp,树状数组】的更多相关文章

  1. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  2. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  3. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  4. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  5. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  6. Codeforces 909 C. Python Indentation (DP+树状数组优化)

    题目链接:Python Indentation 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现.现在有一种简化版的Python,只有两种语句: (1)'s'语句:Simple ...

  7. 2015南阳CCPC C - The Battle of Chibi DP树状数组优化

    C - The Battle of Chibi Description Cao Cao made up a big army and was going to invade the whole Sou ...

  8. 【eJOI2020】考试(dp & 树状数组优化)

    Description \(n\) 个正整数排成一列,每个位置 \(i\) 有一个初始值 \(A_i\) 以及目标值 \(B_i\). 一次操作可以选定一个区间 \([l, r]\),并将区间内所有数 ...

  9. CodeForces - 597C Subsequences 【DP + 树状数组】

    题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...

随机推荐

  1. 动态数据库PI、edna insql、infoplus简单了解

    一.动态数据库概念 动态数据库(DDL)是做为共享函数库的可执行文件.动态数据库提供了一种方法,使进程可以调用不属于其可执行代码的函数.说白了就是一个.dll可执行文件,其中有可执行代码,进程可以调用 ...

  2. C# 高级进阶(一)

    产品是怎样开发出来的 首先了解--产品MVP(Minimum Viable Product)的概念 最小可行产品--意思即开发最初应该是根据参品预期,最快构建出一个符合预期可行的功能合集,后期再通过用 ...

  3. 图解Java 垃圾回收机制

    摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区.关于对象 ...

  4. Python 3.10 is coming!

    看看Python 官网的文档 whatsnew,Python 3.10 已然距离我们越来越近了,然我们看看 Python 3.10 相较于 Python 3.9 有哪些改变吧 新特性 通过括号来组织多 ...

  5. git,github,webstrom配置

    在使用 WebStorm 上传本地项目到 GitHub 之前,先要做一些相关配置. 首先打开 WebStorm ,依次点击File -> Settings... 打开系统设置面板,在上面搜索 g ...

  6. openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问

    准备好工作目录 mkdir work cd work mkdir conf logs 准备好 conf/nginx.conf 配置文件, 把 your.domain 换成你自己的域名 user abc ...

  7. “ShardingCore”是如何针对分表下的分页进行优化的

    分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...

  8. JDK1.8源码(二)——java.lang.Integer类

    一.初识 1.介绍 int 是Java八大基本数据类型之一,占据 4 个字节,范围是 -2^31~2^31 - 1,即 -2147483648~2147483647.而 Integer 是 int 包 ...

  9. Linu常用日志分析实战

    日志结构分析 分析日志状态码所在位置为第九个 遍历取出第一行日志的每个字段 //取出第一行日志 awk 'NR==1{for(i=1;i<=NF;i++)print i"= " ...

  10. Nginx:无处不在的Nginx的八个应用场景与配置

    --- 阅读时间约 15 分钟 --- Nginx概述 众所周知,互联网已经离不开  WEB服务器  ,技术领域中  WEB服务器  不止  Nginx  一个,其他还有很多如  Apache  . ...