最长上升子序列 O(nlogn)
题意:求一个序列中的最长上升子序列。
平常我用的是N*N做法,但是一遇到需要nlogn时,就被卡的无地自容了。
所以下定决心要学习nlogn做法。
如何实现nlongn哪?
这里要用到一个栈B,记录按照时间顺序输入的一个上升子序列。
每输入一个数a就放入栈中,如果a>B[top] ,就放在下一位(B[++top]=a)
如果a<B[top],在栈中找到一个最小的大于等于a的b,(找到一个下限)。让栈内部的数更新变小,以期装更多的数。
最后栈的高度就是最长上升子序列的长度。

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<math.h> using namespace std; int maxn,n,a[100009],B[100009],cnt; int find(int x) { int l,r,mid; l=0,r=cnt; while(l<=r) { mid=(l+r)/2; if(B[mid]>=x) r=mid-1; else l=mid+1; } return l; } int main() { // freopen("sort.in","r",stdin); // freopen("sort.ans","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); B[0]=-1;cnt=0; for(int i=1;i<=n;i++) { if(a[i]>B[cnt]) B[++cnt]=a[i]; else{ int t=find(a[i]); B[t]=a[i]; } } cout<<cnt; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App