[LIS][树状数组]JZOJ 4810 道路规划
分析
把每个数在上面的位置映射到下面,样例就是:
5 2 4 1 3
那么显然上面位置与下面位置相逆的是合法方案,所以可以倒着求最长上升子序列
#include <iostream> #include <cstdio> #define lowbit(x) x&-x using namespace std; const int N=1e5+10; int n; int a[N],b[N],t[N],mlen; void Add(int x,int k) { for (;x<=n;x+=lowbit(x)) t[x]=max(t[x],k); } int Query(int x) { int ans=0; for (;x;x-=lowbit(x)) ans=max(ans,t[x]); return ans; } int main() { scanf("%d",&n); for (int i=1,A;i<=n;i++) scanf("%d",&A),a[A]=i; for (int i=1;i<=n;i++) scanf("%d",&b[i]),b[i]=a[b[i]]; for (int i=n;i;i--) { int q; mlen=max(q=Query(b[i])+1,mlen); Add(b[i],q); } printf("%d",mlen); }
在日渐沉没的世界里,我发现了你。