传送门

Description

数组A包含N个整数。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:1 3 2 0 4,1 3 4,1 2 4均为A的LIS。其中元素1和4一定会出现在LIS当中,元素2和3可能会出现在LIS当中,元素0一定不会出现在LIS当中。给出数组A,输出哪些数可能出现在LIS中,哪些数一定出现在LIS中。输出数字对应的下标,下标编号从1开始,编号为1 - N。例如:1 3 2 0 4,可能出现的元素为3和2,对应的下标为2和3。一定出现的元素为1和4,对应下标为1和5.

Input

第1行:1个数N,表示数组的长度。(1 <= N <= 50000)

第2 - N + 1行:每行1个数A[i],表示数组的元素(0 <= A[i] <= 10^9)

Output

第1行:可能出现在LIS中的数的下标,中间用空格分隔。(输出的下标按照递增排序)

第2行:一定会出现在LIS中的数的下标,中间用空格分隔。(输出的下标按照递增排序)

Sample Input

5

1

3

2

0

4

Sample Output

A:2 3

B:1 5

Solution

正的跑最长上升子序列,反的跑最长下降子序列

如果正反的dp值相加等于len+1(自己加了两次)说明可能在LIS中

若dp值独一无二且可能出现即为一定出现

Code

//By Menteur_Hxy
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2?EOF:*p1++)
using namespace std; char buf[1<<21],*p1,*p2;
inline int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
} const int N=50010;
int n,len;
bool vis1[N],vis2[N];
int a[N],s[N],f[N],g[N];
vector<int> V[N]; int main() {
n=read();
F(i,1,n) a[i]=read();
F(i,1,n) {
if(s[len]<a[i]) s[++len]=a[i],f[i]=len;
else {
int tmp=lower_bound(s+1,s+1+len,a[i])-s;
s[tmp]=a[i];f[i]=tmp;
}
}
len=0;
R(i,1,n) {
if(s[len]<-a[i]||!len) s[++len]=-a[i],g[i]=len;//无脑取负qwq
else {
int tmp=lower_bound(s+1,s+1+len,-a[i])-s;
s[tmp]=-a[i];g[i]=tmp;
}
}
F(i,1,n) {
if(f[i]+g[i]==len+1) vis1[i]=1;
if(vis1[i]) V[f[i]].push_back(i);
}
F(i,1,n) {
int siz=V[i].size();
if(siz==1) vis2[V[i][0]]=1;
}
// F(i,1,n) cout<<f[i]<<" ";cout<<endl;
// F(i,1,n) cout<<g[i]<<" ";cout<<endl;
putchar('A');putchar(':'); F(i,1,n) if(vis1[i]&&!vis2[i]) printf("%d ",i);
putchar('\n');
putchar('B');putchar(':'); F(i,1,n) if(vis2[i]) printf("%d ",i);
return 0;
}

[51Nod 1218] 最长递增子序列 V2 (LIS)的更多相关文章

  1. 51nod 1218 最长递增子序列 V2——LIS+思路(套路)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...

  2. 51nod 1218 最长递增子序列 V2(dp + 思维)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 题解:先要确定这些点是不是属于最长递增序列然后再确定这 ...

  3. [51Nod] 1218 最长递增子序列 V2

    如何判断一个元素是否一定在LIS中?设f[i]为以ai结尾的LIS长度,g[i]为以ai开头的LIS长度,若f[i]+g[i]-1==总LIS,那么i就一定在LIS中出现 显然只出现一次的元素一定是必 ...

  4. 51nod 1218 最长递增子序列 | 思维题

    51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...

  5. 51Nod 1376 最长递增子序列的数量 —— LIS、线段树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 1376 最长递增子序列的数量 基准时间限制:1 秒 空 ...

  6. 51nod 1376 最长递增子序列的数量(线段树)

    51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...

  7. 51nod 1134 最长递增子序列

    题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...

  8. 最长递增子序列(LIS)(转)

    最长递增子序列(LIS)   本博文转自作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   --- 最长递增子序列又叫做最长上升子序列 ...

  9. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

随机推荐

  1. java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

    java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...

  2. [Tools] VS Code Tips

    Inside one file, you can freely mark the number 1-9: -] And jump to Number of bookmark: cmd + [-] It ...

  3. Sahara中的数据模型

    声明: 本博客欢迎转载.但请保留原作者信息,并请注明出处! 作者:郭德清 团队:华为杭州OpenStack团队 本文主要是介绍下Sahara中一些常见的数据模型. 1.Config 用于描写叙述配置信 ...

  4. oc25--私有变量私有方法

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _a ...

  5. maven变量

    一.pom文件,maven内置变量 ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputD ...

  6. Java执行定时任务

    一.用java.util.Timer 使用JAVA类Timer可实现简单的延迟和周期性任务,其中的任务使用java.util.TimerTask表示.任务的执行方式有两种: 按固定速率执行:即sche ...

  7. 简述RTMPDump与编译移植

    RTMPDump主页 ,RTMPDump库主要包含三部分: 1.一个基本的客户端程序 2.两个服务器程序(rtmpsrv.rtmpsuck) 3.一个支持rtmp协议的库—librtmp 下载RTMP ...

  8. PCB MS SQL跨库执行SQL 获取返回值

    一.SQL跨库执行SQL 获取返回值 ) DECLARE @sql nvarchar(MAX) DECLARE @layer INT SET @Dblink = 'P2.fp_db.dbo.' sel ...

  9. HDU1043 Eight

    题目: 简单介绍一下八数码问题:        在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8           在上图中,由于右下角位置是空的 ...

  10. C#将文件压缩成一个文件流,供前端下载

    直接上代码供大家参考... 前端页面就是一个下载的Button.. <body> <form id="form1" runat="server" ...