题意:给一个长度为n的序列。问每一个数关于序列的LIS(longest increasing subsequence)是什么角色。

这里分了三种:

1、此数没有出如今随意一条LIS中

2、此数出如今至少一条可是不是所有的LIS中

3、此数出如今全部的LIS中

解法:nlgn的LIS算法能够求出以每一个i位置结束的LIS长度up[i]。

出如今LIS的数事实上就是一个dag,找出那些某层唯一数值的数即可。LIS算法后,从后向前扫。维护所以长度的最大值,这中间能够推断某长度有几个值,假设某些长度有多个位置则他们都属于2,假设某长度仅仅有一个位置则属于3,其余都是非LIS元素。在推断多个的时候。某个数num[i]能够松弛他的长度位置,条件要保证他比此时help[up[i+1]]的数小,由于这样才干保证他在LIS中(LIS最后一个元素是特判的)。

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define inf 10000000 using namespace std;
const int Max=100010;
int num[Max];
int up[Max];
int down[Max];
int D[Max];
void getLIS(int num[],int n)
{
int last=0;
for(int i=0; i<n; i++)
{
up[i]=lower_bound(D,D+last,num[i])-D+1;
if(up[i]>last) D[last = up[i]]=num[i];
D[up[i]-1]=num[i];
}
}
int help[Max];
int ne[Max];
int ans[Max];
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
scanf("%d",num+i);
getLIS(num,n);
int ma=0;
for(int i=n-1; i>=0; i--)
ma=max(ma,up[i]);
for(int i=n-1; i>=0; i--)
{
if(up[i]==ma)
{
if(help[up[i]]==0)
ans[i]=3,ne[ma]=i;
else
{
ans[i]=2;
ans[ne[ma]]=2;
ne[ma]=i;
}
help[up[i]]=num[i];
}
else
{
if(num[i]>=help[up[i]+1])
ans[i]=1;
else
{
if(help[up[i]]==0)
ans[i]=3,ne[up[i]]=i;
else
{
ans[i]=2;
ans[ne[up[i]]]=2;
ne[up[i]]=i;
}
help[up[i]]=num[i];
}
}
}
for(int i=0; i<n; i++)
cout<<ans[i];
cout<<endl;
}
return 0;
}

486E - LIS of Sequence(LIS)的更多相关文章

  1. Codeforces 486E LIS of Sequence(线段树+LIS)

    题目链接:Codeforces 486E LIS of Sequence 题目大意:给定一个数组.如今要确定每一个位置上的数属于哪一种类型. 解题思路:先求出每一个位置选的情况下的最长LIS,由于開始 ...

  2. Codeforces 486E LIS of Sequence

    LIS of Sequence 我们先找出那些肯定不会再LIS里面. 然后我们从前往后扫一次, 当前位置为 i , 看存不存在一个 j 会在lis上并且a[ j ] > a[ i ], 如果满足 ...

  3. Codeforces Round #277 (Div. 2) E. LIS of Sequence DP

    E. LIS of Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/pr ...

  4. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  5. uva 10534 Wavio Sequence LIS

    // uva 10534 Wavio Sequence // // 能够将题目转化为经典的LIS. // 从左往右LIS记作d[i],从右往左LIS记作p[i]; // 则最后当中的min(d[i], ...

  6. hdu_3564_Another LIS(线段树+LIS)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3564 题意:给你N个数的位置.数i的位置为第i个数,比如 0 0 2,表示1插在第0个位置,此时数列为 ...

  7. HDU 4352 XHXJ's LIS 数位dp lis

    目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...

  8. Codeforces 486E LIS of Sequence 题解

    题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...

  9. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

随机推荐

  1. C++,对象的 =赋值 以及 复制构造函数赋值

    1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...

  2. JVM -- 类加载

    学习自周志明老师的<深入理解Java虚拟机>第二版 类的加载时机 如上图所示: 类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了: 加载.验证.准备.解析.初始化. ...

  3. HDU 3925 Substring 【大数相减】

    题目意思是,给你提供两个数字 a 和 b a 可以不断的往上加, 直到b 为其子串 问的是 a 最小加几? 显而易见,a  的数据范围给了10 ^100非常大,直接模拟肯定不行 那么就用 b 减去 a ...

  4. Ubuntu 12.04 安装JDK 8和Eclipse

    Ubuntu 12.04 下安装 JDK8 方法一:(缺点是安装时附加openjdk等大量程序并无法去除,长处是安装简单) $ sudo apt-get install eclipse 方法二:(长处 ...

  5. Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler

    目前很多Android应用都会实现按返回键时提示“再按一次推退出” 在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法 方法一: 直接计 ...

  6. Eclipse中JBOSS5.1无法启动的问题解决办法

    今天在Eclipse中启动JBoss 5.1时遇到这样的一个错误: …… ERROR [AbstractKernelController] Error installing to Instantiat ...

  7. 更换Winform 皮肤(下)----完全GDI+绘制

    skin皮肤和DLL程序及文件:下载 链接:http://www.cnblogs.com/DebugLZQ/archive/2013/04/15/3021659.html

  8. BZOJ AC 200题留念

    话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.

  9. IOS SWIFT UITableView 实现简单微博列表

    // // Weibo.swift // UITableViewCellExample // // Created by XUYAN on 15/8/15. // Copyright (c) 2015 ...

  10. Android应用开发:CardView的使用及兼容

    引言 在Google I/O 2014上,Google公布了Android L Preview版本,此版本的UI有了非常大的改变,很炫很给力!同时,Google也给出了两个可以向下兼容的控件放到了V7 ...