首先是代码量小的bit
值域上建立bit, 需要注意合并类型应该有单调性
https://www.luogu.com.cn/problem/AT_dp_q
https://www.luogu.com.cn/record/133869096
线段树
值域上建立线段树,区间查询,单点改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream> #include<queue> #include <cstring> #define IOS std::ios::sync_with_stdio(0) using namespace std; const int N = 1e5, M =1e5; #define k1 k<<1 #define k2 k<<1|1 int n,f[N],a[N]; int mx[M<<2],L=0 ; void up( int k){ mx[k] =max(mx[k1],mx[k2]) ; } void build( int k, int l, int r){ if (l==r){ mx[k]=1; return ; } int md =(l+r)/2 ; build(k1,l,md);build(k2,md+1,r) ; up(k); } int qq( int k, int l, int r, int x, int y){ if (x<=l && y>=r) return mx[k] ; int md=(l+r)>>1; int t =0 ; if (x<=md) t=max(t,qq(k1,l,md,x,y)); if (y>md) t=max(t,qq(k2,md+1,r,x,y)); return t; } void change( int k, int l, int r, int x, int v){ if (l==r){ mx[k]=v; return ; } int md=(l+r)>>1; if (x<=md ) change(k1,l,md,x,v) ; else change(k2,md+1,r,x,v); up(k) ; } signed main(){ cin>>n; for ( int i=1;i<=n;i++) cin>>a[i],f[i]=1,L=max(L,a[i]); build(1,1,L); for ( int i=1;i<=n;i++){ f[i] =max(f[i], qq(1,1,L, a[i],L)+1); change(1,1,L, a[i],f[i]); } int ans= 0; for ( int i=1;i<=n;i++) ans=max(ans,f[i]); cout<<ans-1 <<endl; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战