LIS与LCS的nlogn解法
2024-09-05 09:02:23
LIS(nlogn)
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+;
int a[maxn];
int n;
int lis[maxn];
int len=;
int find(int x){
int l=,r=len,m;
while(l<r){
m=l+(r-l)/;
if(lis[m]>=a[x]){//这里若去掉等号即为 非严格递增序列
r=m;
}
else{
l=m+;
}
}
return l;
}
int main(void){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
lis[]=a[];
for(int i=;i<=n;i++){
if(a[i]>lis[len]){
lis[++len]=a[i];
}
else{
int pos=find(i);
lis[pos]=a[i];
}
}
printf("%d",len);
return ;
}
LCS(nlogn)
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn=1e6+;
int n,len=;
int lis[maxn];
int a[maxn];
int b[maxn];
int loc[maxn];
int find(int x){
int l=,r=len,m;
while(l<r){
m=l+(r-l)/;
//if(lis[m]>=b[x]){//智障错误,找了那么久。。
if(lis[m]>=x){
r=m;
}
else l=m+;
}
return l;
}
int main(void){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
loc[b[i]]=i;
}
for(int i=;i<=n;i++){
b[i]=loc[a[i]];
}
// for(int i=1;i<=n;i++)printf("%d",b[i]) ;//
// printf("\n");
if(n!=)lis[++len]=b[];
for(int i=;i<=n;i++){
if(b[i]>lis[len]){
lis[++len]=b[i];
}
else{
int pos=find(b[i]);
lis[pos]=b[i];
}
}
printf("%d",len);
return ;
}
最新文章
- 使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本
- 开发培训及技术研讨会PPT下载链接
- LinkedIn的即时消息:在一台机器上支持几十万条长连接
- #include <;stdarg.h>;
- 问题解决——使用串口调试助手发送控制字符 协议指令 <;ESC>;!?
- Codeforces Round #380 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 2) D. Sea Battle 模拟
- BZOJ3695 滑行
- 简单Sql语句统计每年每个月的数据,每个月为数据的每列,简单SQL练习
- [Laravel]配置路由小记
- [git] git 的基本认知
- session的简单使用
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
- 表达式求值(二叉树方法/C++语言描述)(二)
- php优秀的库
- Python3学习之路~5.9 xml处理模块
- [转]权限系统与RBAC模型概述[绝对经典]
- Electron 发生错误 ";Cannot find module app";的解决方案
- C++.构造函数(超出范围)_01
- mmc生产任务分配问题续
- MyBatis - (一) 基本数据操作命令和简单映射