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

记$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. python学习笔记(十四)之字典

    字典:是python中唯一的映射类型,字典中每一项都是由键-值对组成的项.字典中没有索引,只有键和值.键的类型可以是整型,变量或字符串. 创建和访问字典: >>> dict1 = { ...

  2. 8、V模型、W模型、H模型

    软件测试&软件工程 ·软件测试与软件工程息息相关,软件测试是软件工程组成中不可或缺的一部分.·在软件工程.项目管理.质量管理得到规范化应用的企业,软件测试也会进行得比较顺利,软件测试发挥的价值 ...

  3. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

  4. 一. Jmeter--使用代理录制脚本

    Jmeter脚本是以.JMX格式为主 1. Jmeter也是支持录制的,支持第三方录制方式和代理录制方式. (1).第三方录制主要是通过badboy来录制,录制后另存为jmx格式即可. (2).Jme ...

  5. thinkphp中的验证器

  6. Java Eclipse 配置

    1.清除多余记录 最近用eclipse打包jar的时候,需要指定一个main函数.需要先运行一下main函数,eclipse的Runnable JAR File Specification 下的Lau ...

  7. AJP与HTTP比较和分析

    系统环境: OS:Ubuntu 10.10 (2G) Servlet Container:tomcat-tomcat-7.0.23  (最大内存:default 256M  maxThreads:50 ...

  8. List基本用法

    List最为Collection接口的子接口,当然可以使用Collection接口里的全部方法.而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法: public c ...

  9. C# String.Format用法和格式说明

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  10. CGI、FastCGI和php-fpm的概念和区别

    CGI是HTTP Server和一个独立的进程之间的协议,把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP ...