Longest Increasing Subsequence HDU - 6284
/*
首先预处理好f g数组
fi :以a[i]为结尾的 最长上升子序列的长度
gi :以a[i]为开始的 最长上升子序列的长度
mxx : 最长上升子序列的长度
线段树优化 nlogn
(不包含a[i]==0) 显然把所有0换成x 只可能是mxx变成mxx+1 然后我们考虑一对 i j (下标)
若 f[i]+g[j]==mxx 则 所有a[i]+1~~~a[j]-1之间的x
他们对用的lis长度为mxx+1
然后枚举i j凉了
对于一个i 我们只需要找到 他后面的 一个j 满足 f[i]+g[j]==mxx 并且a[j]最大
然后维护bg[i] 表示长度为g[j]==i的所有的 a[j]中最大的
从后往前枚举i 然后维护 bg O(1)转移
上述过程可能 i和bg维护的j之间 他没有0 那就不能转移
所以 按0分段 遇到0 就把之前的信息更新bg 然后没了 */
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define lc k*2
#define rc k*2+1
#define mid (l+r)/2
#define maxn 400010
#define ll long long
using namespace std;
ll n,a[maxn],f[maxn],s[maxn],g[maxn],as[maxn],bg[maxn],c[maxn][];
void Insert(ll k,ll l,ll r,ll x,ll y){
if(x==l&&r==x){
s[k]=max(s[k],y);return;
}
if(x<=mid)Insert(lc,l,mid,x,y);
else Insert(rc,mid+,r,x,y);
s[k]=max(s[lc],s[rc]);
}
ll Query(ll k,ll l,ll r,ll x,ll y){
if(x>y)return ;
if(x<=l&&y>=r)return s[k];
ll res=;
if(x<=mid)res=max(res,Query(lc,l,mid,x,y));
if(y>mid)res=max(res,Query(rc,mid+,r,x,y));
return res;
}
int main(){
while(~scanf("%lld",&n)){
for(ll i=;i<=n*;i++)
s[i]=f[i]=g[i]=as[i]=;
for(ll i=;i<=n;i++){
scanf("%lld",&a[i]);
//a[i]=rand();
f[i]=;g[i]=;
}
ll mxx=;
for(ll i=;i<=n;i++){
if(a[i]==)continue;
ll mx=Query(,,n,,a[i]-);
f[i]=mx+;mxx=max(mxx,f[i]);
Insert(,,n,a[i],f[i]);
}
for(ll i=;i<=n*;i++)s[i]=;
for(ll i=n;i>=;i--){
if(a[i]==)continue;
ll mx=Query(,,n,a[i]+,n);
g[i]=mx+;Insert(,,n,a[i],g[i]);
}
for(ll i=;i<=n*;i++)bg[i]=;
ll cnt=;a[]=-;
for(ll i=n;i>=;i--){
if(a[i]==){
for(ll j=;j<=cnt;j++)
bg[c[j][]]=max(bg[c[j][]],c[j][]);
cnt=;bg[]=n+;
}
else{
ll mx=bg[mxx-f[i]];
c[++cnt][]=g[i];c[cnt][]=a[i];
if(mx-<a[i]+)continue;
as[a[i]+]++;as[mx]--;
}
}
ll ans=;
for(ll i=;i<=n;i++)as[i]+=as[i-];
for(ll i=;i<=n;i++){
if(as[i]>)ans+=i*(mxx+);
else ans+=i*mxx;
//("%lld\n",ans);
}
printf("%lld\n",ans);
}
return ;
}
Longest Increasing Subsequence HDU - 6284的更多相关文章
- 最长上升子序列 LIS(Longest Increasing Subsequence)
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...
- [LeetCode] Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- [tem]Longest Increasing Subsequence(LIS)
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- Leetcode 300 Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- [LeetCode] Longest Increasing Subsequence
Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...
- The Longest Increasing Subsequence (LIS)
传送门 The task is to find the length of the longest subsequence in a given array of integers such that ...
- 300. Longest Increasing Subsequence
题目: Given an unsorted array of integers, find the length of longest increasing subsequence. For exam ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
随机推荐
- canvas一周一练 -- canvas绘制立体文字(2)
运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...
- C++ 程序的编译
一.编译器都具备集成开发环境(Integrated Developed Environment,IDE) 二.程序源文件命名约定: C++ 的后缀一般是 .cpp .cc .C .cpp .cxx 三 ...
- BeanFactory的生命周期
Bean自身的方法:调用Bean构造函数实例化Bean.调用setter设置Bean的属性值及通过<beam=n>的init-method和destory-method所制定的方法. Be ...
- 微信小程序中使用ECharts 异步加载数据 实现图表
<!--pages/bar/index.wxml--> <view class="container"> <ec-canvas id="my ...
- 当点阵字库遇到3D
早在遥远的DOS时代,点阵汉字库为计算机处理汉字起到了关键作用.当时的显示器在图形模式下的分辨率只有640x480甚至320x200,显示汉字直接使用点阵字库在屏幕上打点就可以了.如今的电脑屏幕甚至手 ...
- Xcode git 忽略user interface state文件
退出xcdoe, 打开终端(Terminal),进入到你的项目目录下 在终端输入如下代码 git rm --cached *.xcuserstate git commit -m "Remov ...
- LinuxMint19.1安装搜狗拼音输入法
Installation 1.到搜狗拼音输入法官网下载Linux版. 2.使用dpkg命令安装deb软件包 $ sudo dpkg -i sogoupinyin_2.2.0.0108_amd.deb ...
- LINUX-初始化一个文件系统
mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1 ...
- python virtualenv 虚拟环境的应用
为什么要使用python的虚拟环境呢?: 首先我们来说不实用虚拟环境的情况: 在Python应用程序开发的过程中,系统安装的Python3只有一个版本:3.7.所有第三方的包都会被pip3安装到 ...
- v-on(事件处理)
1.监听事件 v-on:click="msg+=1" (msg是写在data里) 2.方法事件处理器 v-on:click = "jia" (jia是写在me ...