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

记$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. [csp-201709-3]JSON查询-编译原理

    声明:这个代码几乎完全就是照抄hyh学长的!!! 有什么问题我会删掉这篇的emm 当初面试的时候我的方向就是编译原理...然后学长发了个1400+的代码实现一个简化的c编译器...没看懂qaq 感觉很 ...

  2. Markdown tutorial [repost]

    1. italic We'll start by learning two basic elements in text formatting: italics and bold. In these ...

  3. THINKPHP简单商品查询项目

    代码:http://files.cnblogs.com/files/wordblog/test.zip

  4. iOS中UITabelView

    1.概述 继承自UIScrollView,只能显示一列数据,只能纵向滑动.堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易.当使用的时候我们必须要考虑到后台数据的设计,tabl ...

  5. 【BubbleCup X】G:Bathroom terminal

    一个hash的题 对?出现位置直接暴力枚举,然后hash判断下,扔进map里 cf的评测机跑的针tm块 #include<bits/stdc++.h> ; ; typedef long l ...

  6. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  7. openjudge-NOI 2.6-1759 最长上升子序列

    题目链接:http://noi.openjudge.cn/ch0206/1759/ 题解: 奇怪……之前博客里的o(nlogn)标程在codevs和tyvj上都能AC,偏偏它这里不行 #include ...

  8. mybatis注解使用

    spring整合mybatis时,要使用mybatis的注解,需要spring-config.xml文件中添加下述配置: <!--下述配置指明了我们的Mapper,即Dao,在相应的包里也就可以 ...

  9. java基础11 继承(super、extends关键字和重写,这三个要素出现的前提:必须存在继承关系)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  10. 产生随机数 random

    int rand(void); 返回 0 ------- RAND_MAX 之间的一个 int 类型整数,该函数为非线程安全函数.并且生成随机数的性能不是很好,已经不推荐使用.        void ...