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 ...
随机推荐
- Sass 主要知识点小记
Sass 主要知识点小记 以前写样式的时候,每个元素的颜色,背景色都需要重新写一遍,然后就想CSS难道没有变量么?最后就查到Sass.但当时没有静下心来好好的看一下,今天正好有时间,就在这里边看边整理 ...
- Linux下ifconfig不显示ip地址问题总结
问题一:ifconfig之后只显示lo,没有看到eth0 ? eth0设置不正确,导致无法正常启动,修改eth0配置文件就好 ubuntu 12.04的网络设置文件是/etc/network/inte ...
- vue项目国际化实现 vue-i18n使用详细教程
1.安装vue-i18n: npm i vue-i18n -S 当然你也可以这样: <script src="https://unpkg.com/vue/dist/vue.js&quo ...
- php部分基础
变量使用$,如$num = 1; 或 $name = 'hey'; 创建数组:$arr = array('a','b','c'); 或 $arr = array('a' => $name); 取 ...
- P4817 [USACO15DEC]Fruit Feast 水果盛宴
P4817 [USACO15DEC]Fruit Feast 水果盛宴 现在Bessie的饱食度为 00 ,她每吃一个橙子,饱食度就会增加 AA :每吃一个柠檬,饱食度就会增加 BB .Bessie还有 ...
- Linux 下 Bash 脚本对拍
背会... #!/bin/bash i= while true ;do ./maker > data.in ./a <data.in> data.out ./b <data.i ...
- TensorFlow — 相关 API
TensorFlow — 相关 API TensorFlow 相关函数理解 任务时间:时间未知 tf.truncated_normal truncated_normal( shape, mean=0. ...
- 抽象类和接口有什么区别---https://blog.csdn.net/csdn_aiyang/article/details/71171886
https://blog.csdn.net/csdn_aiyang/article/details/71171886 概念] 抽象类.具体类是相对的,并非绝对的.抽象是一种概念性名词,具体是一种可 ...
- Codeforces Round #544 (Div. 3) Editorial C. Balanced Team
http://codeforces.com/contest/1133/problem/Ctime limit per test 2 secondsmemory limit per test 256 m ...
- Jeecg+fixflow,工作流框架分享
工作流引擎使用fixflow. 动态表达使用jeecg. 不多说直接上源码. 注:本人使用的jdk为6.0.mysql.tomcat6.0 其中fixflow-expand 为eclips流程设计核心 ...