题意:

  给出一个长度为n的序列,序列中包含0。定义f(i)为把所有0变成i之后的Lis长度,求∑ni=1i⋅f(i)。

题解:

  设不考虑0的Lis长度为L,那么对于每个f(i),值为L或L+1。

  预处理f[j],g[j]代表在第j个数结束和从第j个数开始的Lis长度。

  对于(1~n)的每个j,找到一个最大的a[k](k>j且a[k]>a[j]),使得g[j]+f[k] = L且j和k之间存在0。那么(a[j],a[k])区间内的数的f()值即为L+1。

  从后面往前扫,对于当前点j,vis[L-a[j]]即为最大的a[k]。每到一个0就更新上一个0到这个0的vis信息,保证了j和k之间一定存在着0。若vis[L-a[j]]>a[j],则用差分的形式对(a[j],vis[L-a[j]])区间进行+1。

最后维护下前缀和判断f()的值。还有两种是0 2 和 2 0 这种前缀0和后缀0的情况要特判一下。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+;
const int inf = 0x3f3f3f3f;
int n, pos;
int L;
int a[N];
int f[N], g[N], vis[N];
ll sum[N];
ll ans, cnt;
int main() {
while(~scanf("%d", &n)) {
L = ;
ans = cnt = ;
for(int i = ; i <= n; i++) vis[i] = inf;
for(int i = ; i <= n; i++) sum[i] = ;
for(int i = ; i <= n; i++) scanf("%d", &a[i]), cnt+=a[i];
if(!cnt) {
printf("%lld\n", 1ll*n*(n+)/);
continue;
}
for(int i = ; i <= n; i++) {
if(!a[i]) continue;
int p = lower_bound(vis+, vis+n+, a[i])-vis;
L = max(L, p);
vis[p] = a[i];
f[i] = p;
}
for(int i = ; i <= n; i++) vis[i] = inf;
for(int i = n; i >= ; i--) {
if(!a[i]) continue;
int p = lower_bound(vis+, vis+n+, -a[i])-vis;
vis[p] = -a[i];
g[i] = p;
}
for(int i = ; i <= n; i++) vis[i] = ;
pos = n+;
for(int i = n; i >= ; i--) {
if(a[i]&&pos!=n+) {
if(f[i]==L) sum[a[i]+]++;
else if(vis[L-f[i]]>a[i]+) sum[a[i]+]++, sum[vis[L-f[i]]]--;
}
else if(!a[i]) {
for(int j = pos-; j > i; j--) vis[g[j]] = max(vis[g[j]], a[j]);
pos = i;
}
}
int pos = ;
for(int i = ; i <= n; i++) {
if(pos&&a[i]&&g[i]==L) sum[]++, sum[a[i]]--;
if(!a[i]) pos++;
}
for(int i = ; i <= n; i++) sum[i] += sum[i-];
for(int i = ; i <= n; i++) {
if(sum[i]) ans += 1ll*i*(L+);
else ans += 1ll*i*L;
}
printf("%lld\n", ans);
}
}

  

最新文章

  1. Oracle 查询表中字段里数据是否有重复
  2. RecyclerView-------MyAdapter代码
  3. HDU HDU1558 Segment set(并查集+判断线段相交)
  4. PE文件结构学习
  5. SQL SERVER -&gt;&gt; CXPacket等待类型
  6. Java IO :文件
  7. apache禁止公网IP访问的配置
  8. 解决IE8下CSS3选择器 :nth-child() 不兼容的问题
  9. mysql5.5以上 用户的操作
  10. python学习笔记之四-多进程&amp;多线程&amp;异步非阻塞
  11. 针对模拟滚动条插件(jQuery.slimscroll.js)的修改
  12. linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
  13. ElasticSearch - query vs filter
  14. U3D组件------CharacterController(角色控制器)
  15. 从C# 2.0新特性到C# 3.5新特性
  16. 基础练习 Huffuman树
  17. flask的g对象
  18. pygame--颜色变化
  19. GridControl详解(九)表格中的控件
  20. mac下finder子目录直接打开终端

热门文章

  1. react的 react-router使用
  2. VMware中Ubuntu开机时停在启动界面,不进入X-window的解决办法
  3. docker启用镜像常用脚本
  4. form表单submit按钮提交页面不跳转
  5. kangle环境liunx一键安装脚本
  6. GMT 时间格式转换到 TDateTime (Delphi)
  7. contextmanager 的基本使用
  8. python面向对象(进阶篇)
  9. static关键字什么意思?Java中是否可以覆盖一个private或者是static的方法?
  10. Hadoop学习笔记系列