题意:给一个长度为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. BZOJ 3275: Number( 最小割 )

    S->每个奇数,每个偶数->T各连一条边, 容量为这个数字.然后不能同时选的两个数连容量为+oo的边. 总数-最大流即是答案. 因为满足a2+b2=c2的a,b一定是一奇一偶或者两个偶数, ...

  2. Android:AysncTask异步加载

    以下是链接: http://blog.csdn.net/abc5382334/article/details/17097633 http://keeponmoving.iteye.com/blog/1 ...

  3. Android线程和handler

    根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bund ...

  4. Easyui datagrid 批量编辑和提交

    <script type="text/javascript"> $(function() { var $dg = $("#dg"); $dg.dat ...

  5. GIT在windows下搭建

    /*********工具准备********* *copSSH *msysgit *TortiseGIT *putty * 安装比较简单,此处省略... *********************** ...

  6. POJ 1142 质因数分解

    只要很朴素的分解就可以了,数据量不大 #include <stdio.h> #include <string.h> #include <stdlib.h> #inc ...

  7. docker学习笔记:容器的网络设置

    创建一个docker容器,docker系统会自动为该容器分配一个ip地址,通常是172.17开头. 我们可以在主机上用 docker inspect 命令 或者进入容器用ifconfig命令来查看容器 ...

  8. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  9. Use Node.js DDP Client on Arduino Yun to Access Meteor Server

    Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...

  10. 第五章:输入输出(IO)管理

     I/O设备概念: 指计算机内部除中央处理器和内存之外的全部设备,通常也称为外部设备.  I/O设备分类:   ·按交互对象分类: ·人机交互设备 ·与计算机或其它电子设备交互的设备 ·计算机间的同信 ...