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 ...
随机推荐
- java多线程(线程通信-等待换新机制-代码优化)
等待唤醒机制涉及方法: wait():让线程处于冻结状态,被wait的线程会被存储到线程池中. noticfy():唤醒同一个线程池中一个线程(任意也可能是当前wait的线程) notifyAll() ...
- Codeforces_765_D. Artsem and Saunders_(数学)
D. Artsem and Saunders time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- 网络编程基础_3.APC队列
APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...
- RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答
如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...
- C语言中指针的加减运算
参考文章,值得一看 char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; ...
- 60.通过应用层join实现用户与博客的关联
在构造数据模型的时候,将有关联关系的数据分割为不同的实体,类似于关系型数据库中的模型. 案例背景:博客网站,一个网站可能有多个用户,一个用户会发多篇博客,此时最好的方式是建立users和blogs两个 ...
- 用Python实现阿里钉钉机器人读取数据库内容自动发群通知
最近想把一些预警数据信息按照一定的要求自动发送到移动端APP,最终把目标放在了腾讯的微信和阿里的钉钉软件上,由于刚开始学习python,于是编程工具想用python来实现.微信使用群体最广,通过一天的 ...
- 【DIP, 图像增强】
第四章 图像增强 图像增强是按特定的需要突出一幅图像中的某些信息,同时削弱或者去除某些不需要的信息的处理方法.其主要目的是使处理后的图像对某种特定的应用来说,比原始图像更加适用.因此这类处理是为了某种 ...
- 【Codeforces 9989C】A Mist of Florescence
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 四个大角 然后每个大角里面包着一些其他颜色的就好 [代码] #include <bits/stdc++.h> using name ...
- Maven学习总结(29)——Maven项目的pom.xml中log4j2配置
<dependency> <groupId>org.apache.logging.log4j</groupId> <a ...