看见标签推荐顺便就做了吧

记$f[i], g[i]$为$i$的含$i$的前缀最长递增子序列和后缀递增子序列

只要满足$f[i] + g[i] == LIS + 1$,那么$i$就是可能的

对于$i$而言,其一定出现在$LIS$中时,当且仅当$f[i]$唯一

如果存在$i, j (i < j)$满足$f[i] = f[j]$,那么一定有$a[i] > a[j]$,这时这两者构成的$LIS$一定不相同

否则,如果$f[i]$唯一,那么所有$f$为$f[i] + 1$的点必须由它转移过来

注:树状数组打快了,结果$i += lowbit(i)$打成了$i ++$.........

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define ri register int
#define sid 50050 int n, cnp, H[sid * ];
int f[sid], g[sid];
int t[sid], a[sid], v[sid]; inline int qry(int x) {
int ret = ;
for(ri i = x; i; i -= i & (-i)) ret = max(ret, t[i]);
return ret;
} inline int mdf(int x, int v) {
for(ri i = x; i <= cnp; i += i & (-i)) t[i] = max(t[i], v);
} int num[sid]; int main() {
n = read();
for(ri i = ; i <= n; i ++) {
v[i] = read();
H[i] = v[i]; H[i + n] = -v[i];
} sort(H + , H + n + n + );
cnp = unique(H + , H + n + n + ) - H - ;
for(ri i = ; i <= n; i ++)
a[i] = lower_bound(H + , H + cnp + , v[i]) - H; for(ri i = ; i <= n; i ++)
f[i] = qry(a[i] - ) + , mdf(a[i], f[i]); memset(t, , sizeof(t));
for(ri i = ; i <= n; i ++)
a[i] = lower_bound(H + , H + cnp + , -v[i]) - H; for(ri i = n; i >= ; i --)
g[i] = qry(a[i] - ) + , mdf(a[i], g[i]); int ans = ;
for(ri i = ; i <= n; i ++) ans = max(ans, f[i]); for(ri i = ; i <= n; i ++)
if(f[i] + g[i] == ans + ) num[f[i]] ++;
printf("A:");
for(ri i = ; i <= n; i ++)
if(f[i] + g[i] == ans + && num[f[i]] > ) printf("%d ", i);
printf("\nB:");
for(ri i = ; i <= n; i ++)
if(f[i] + g[i] == ans + && num[f[i]] == ) printf("%d ", i);
return ;
}

51nod1218 最长递增子序列 V2的更多相关文章

  1. [51Nod 1218] 最长递增子序列 V2 (LIS)

    传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...

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

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

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

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

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

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

  5. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  6. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  7. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...

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

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

  9. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

随机推荐

  1. 【leetcode 简单】第十三题 最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...

  2. Linux命令之uptime

    这是什么 uptime用来查看系统已经启动了多长时间了. 它显示的信息和w命令的头(第一行)是一样一样的. 举个栗子 举一个实际的应用场景: 比如发现服务器上的某些没有加入开机启动的服务挂了一片,这个 ...

  3. 解决爬虫时网站采用gb2312编码所遇到的乱码问题!

    import requests from bs4 import BeautifulSoupall_url = 'http://www.7160.com/qingchunmeinv/' # 请求头 he ...

  4. php的发展历史

    php最初就是为了快速构建一个web页面而迅速被大家广为接受的.它的好处是在代码中能内嵌html的代码,从而让程序员能再一个页面中同时写html代码和php代码就能生成一个web页面. 这篇文章用时间 ...

  5. Installation Guide for Appium 1.6.3

    A.) System Requirements : - Require node 4 or above Xcode 8 iOS 10 B.) Open terminal and type follow ...

  6. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  7. C++ 内联函数inline

    http://blog.csdn.net/u011327981/article/details/50601800 1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码 ...

  8. python selenium登陆网易云音乐

    from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://music.1 ...

  9. SQLserver连接本地服务器

    1.打开SQLserver “连接到服务器” 2.服务器类型:数据库引擎 3.服务器名称:浏览更多->本地服务器->数据库引擎->选择本地服务器 4.身份验证:windows验证 5 ...

  10. 杂乱的code

    /*o(n)的堆化方法*/ void myjust(vector<int>& A,int i){ int l=i*2+1; int r=i*2+2; int minn=i; if( ...