[51Nod] 1218 最长递增子序列 V2
如何判断一个元素是否一定在LIS中?设f[i]为以ai结尾的LIS长度,g[i]为以ai开头的LIS长度,若f[i]+g[i]-1==总LIS,那么i就一定在LIS中出现
显然只出现一次的元素一定是必选,剩下的就是可选了。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector> using namespace std; const int MAXN=; vector<int> vec[MAXN],A,B; int tmp[MAXN],mx[MAXN];
int a[MAXN],f[MAXN],g[MAXN],n;
int b[MAXN];
int t[MAXN],t2[MAXN];
inline void upmax(int &x,int y){x=max(x,y);}
void update(int x,int w){for(int i=x;i<=n;i+=i&-i)upmax(t[i],w);}
int query(int x){int _=;for(int i=x;i;i-=i&-i)upmax(_,t[i]);return _;}
void update2(int x,int w){for(int i=n-x+;i<=n;i+=i&-i)upmax(t2[i],w);}
int query2(int x){int _=;for(int i=n-x+;i;i-=i&-i)upmax(_,t2[i]);return _;}
int main(){
n=rd();
for(int i=;i<=n;i++)tmp[i]=a[i]=rd();
sort(tmp+,tmp++n);
int tot=unique(tmp+,tmp++n)--tmp;
for(int i=;i<=n;i++)a[i]=lower_bound(tmp+,tmp++tot,a[i])-tmp;
int mxf=;
for(int i=;i<=n;i++){
f[i]=query(a[i]-)+;
update(a[i],f[i]);
upmax(mxf,f[i]);
}
for(int i=n;i>=;i--){
g[i]=query2(a[i]+)+;
update2(a[i],g[i]);
}
for(int i=;i<=n;i++){
if(f[i]+g[i]!=mxf+)continue;
vec[f[i]].push_back(i);
}
for(int i=;i<=n;i++){
int s=vec[i].size();
if(s==)continue;
if(s==){A.push_back(vec[i][]);continue;}
for(int j=;j<s;j++)B.push_back(vec[i][j]);
}
sort(A.begin(),A.end());
sort(B.begin(),B.end());
vector<int>::iterator it;
printf("A:");
for(it=B.begin();it!=B.end();it++)printf("%d ",*it);
putchar('\n');
printf("B:");
for(it=A.begin();it!=A.end();it++)printf("%d ",*it); }
[51Nod] 1218 最长递增子序列 V2的更多相关文章
- [51Nod 1218] 最长递增子序列 V2 (LIS)
传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...
- 51nod 1218 最长递增子序列 V2(dp + 思维)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 题解:先要确定这些点是不是属于最长递增序列然后再确定这 ...
- 51nod 1218 最长递增子序列 V2——LIS+思路(套路)
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...
- 51nod 1218 最长递增子序列 | 思维题
51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...
- 51nod 1134 最长递增子序列
题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...
- 51nod 1376 最长递增子序列的数量(线段树)
51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...
- 51Nod 1376 最长递增子序列的数量 —— LIS、线段树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 1376 最长递增子序列的数量 基准时间限制:1 秒 空 ...
- LCS 51Nod 1134 最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个 ...
- 51NOD 1376 最长递增子序列的数量 [CDQ分治]
1376 最长递增子序列的数量 首先可以用线段树优化$DP$做,转移时取$0...a[i]$的最大$f$值 但我要练习$CDQ$ $LIS$是二维偏序问题,偏序关系是$i<j,\ a_i< ...
随机推荐
- Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...
- 在centos中安装最新版nginx,同时更改官方文档路径错误
nginx的可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g ++开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译 ...
- Django + Vue cli 3.0 访问静态资源问题
[问题背景] 用Vue clie 3.0的搭建得框架把我坑死了,在打包后,调用不到静态资源js,css,mp3等 [问题原因] vue cli 3.0打包后,dist目录下没有static目录,而Dj ...
- 已知单链表的数据元素为整型数且递增有序,L为单链表的哨兵指针。编写算法将表中值大于X小于Y的所有结点的顺序逆置。(C语言)
对此题目的完整示例可直接运行代码如下: #include <stdio.h> #include <stdlib.h> typedef struct LNode{ int dat ...
- 课程增加功能(java web)
1.设计思想 先写类DBUtil用来连接数据库.在UserDaoImpl2类中写在数据库中添加课程表信息的方法.然后定义类Calss2来写保存超级课表数据:课程名称,任课教师,上课地点的属性及其get ...
- PS高级特训班 百度云资源(价值2180元)
课程目录: 第1章第一期1第一节 火焰拳头1:12:252第二节 荷叶合成00:05:143第三节 新年巨惠海报(一)1:00:374第四节 新年巨惠海报(二)1:05:345第五节 美食印刷品1 ...
- ruby 正则表达式 匹配所有符合规则的信息
假设一个字符串当中有很多符合规则的信息,下面的例子可以把所有匹配到的结果打印出来: message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew1 ...
- 【踩坑】Nginx上配置ssl证书实现https访问
昨天开始为域名挂上ssl证书,使得可以以https去访问服务器.按照网上所介绍的配置Nginx,然而一直访问不了网站. 第二天排查了一早上,发现不单要配置Nginx,阿里云上安全组要开启443端口,并 ...
- 多线程(Thread、线程创建、线程池)
第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程 ...
- shareTo 网页版分享
// share -------- var shareTo = function (dest, shareCode) { var appKey = "1667889534"; // ...