最长非上升/非下降子序列(O(nlogn)非连续)
2017-10-19 16:13
253 查看
直接上代码,在其他大佬那看的·,当做个模板。
#include<stdio.h> #define N 101000 int s ,a ,d ; int f1(int x,int l,int r) { int m; while(l<r) { m=(l+r)/2; if(s[m]>x) r=m; else l=m+1; } return l; } int f2(int x,int l,int r) { int m; while(l<r) { m=(l+r)/2; if(d[m]>=x) l=m+1; else r=m; } return l; } int main() { int ls,ld,i,j,t,n,ans; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); s[1]=d[1]=a[1]; ls=ld=1; for(i=2;i<=n;i++) { if(a[i]>=s[ls])//上升序列 ans=++ls; else ans=f1(a[i],1,ls); s[ans]=a[i]; if(a[i]<=d[ld]) ans=++ld; else ans=f2(a[i],1,ld-1); d[ans]=a[i]; } for(i=1;i<=ls;i++)//非下降子序列 printf("%d ",s[i]); printf("\n"); for(i=1;i<=ld;i++)//非上升子序列 printf("%d ",d[i]); printf("\n"); } return 0; }
相关文章推荐
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- 最长上升(下降)子序列 O(nlogn)
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法
- 如何用O(nlogn)的的速度求解最长上升(下降)子序列
- lintcode :最长上升连续子序列
- LintCode- 最长上升连续子序列
- poj 1836 Alignment( 最长上升(下降)子序列 )
- hdu 5125 二分nlogn求最长上升子序列(LIS)+dp
- DP经典 之 CODE[VS] 1576 最长严格上升子序列 (O(n^2) 和 O(nlogn))
- UVa 10534 - Wavio Sequence DP+最长上升子序列(严格上升)+二分查找(nlogn)
- 最长不下降子序列的o(nlogn)算法
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- 最长上升子序列(LIS)和最长下降子序列(LDS)
- HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
- 最长递增子序列(nlogn),最长公共子串(连续),最长公共子序列(不连续)
- 最长上升子序列(LIS)长度的O(n^2)与O(nlogn)算法
- 算法:最长上升下降子序列
- 最长不下降子序列 nlogn
- lintcode:最长上升连续子序列