题意:给一个长度为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. 关于int.TryParse的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. web.xml 中<taglib>报错(转载)

    在web.xml加入taglib <taglib> <taglib-uri>/WEB-INF/tiles.tld</taglib- uri> <taglib- ...

  3. 安装centos7注意事项

    1,安装centos7注意1和l的区分 2,每一次对/boot/grub2/或者/boot/grub或者/etc/grub/下的文件修改一定要重新编译配置文件sudo grub2-mkconfig - ...

  4. reStructuredText(.rst)语法规则快速入门

    原文:http://blog.useasp.net/archive/2014/09/05/rst-file-restructuredtext-markup-syntax-quikstart.aspx? ...

  5. HDU 1004 MAP【STL__map_的应用】

    强大的MAP,今天终于开始好好学习一次. map内部是用红黑树维持的有序结构. 定义:map<int,string>mapStudent; 查找的时间复杂度为对数级别. 1.构造方法学习两 ...

  6. JAVA学习中好网站 - -

    http://www.54bk.com 我是博客 http://www.java-cn.com java中文网 http://java.sun.com sun官方网站 http://www.comej ...

  7. myeclipse自动生成注释

    myeclipse自动生成注释 在使用Eclipse编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author的属性值. 我们可以在Eclipse中进行设置自己希望显示 ...

  8. perl 处理文本

    redis01:/root# cat abc GET /api/sale/get_voucher_list?loupan_id=32300&suid=kJIjl&loupan_site ...

  9. WPF(布局)

      WPF编程学习——布局   本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面 ...

  10. android软键盘的管理和属性的设置

    android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...