标签:单调队列
Description
Input
Output
Sample Input
1 6 4 5 2 4 2 2
Sample Output
3
这题可以当模板用,用了单调队列的思想。
模板1:严格下降子序列
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; int a[10006],dp[10006]; int find(int l,int r,int x) { int mid; while(l<=r) { mid=(l+r)/2; if(dp[mid]>x)l=mid+1; else if(dp[mid]<x)r=mid-1; else return mid; } return l; } int main() { int n,m,i,j,T,len,k; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); len=0; for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(len==0){ dp[++len]=a[i];continue; } if(a[i]<dp[len]){ dp[++len]=a[i];continue; } k=find(1,len,a[i]); dp[k]=a[i]; } /*for(i=1;i<=len;i++){ printf("%d ",dp[i]); } printf("\n");*/ printf("%d\n",len); } return 0; }模板2:不上升子序列(非严格)
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; int a[10006],dp[10006]; int find(int l,int r,int x) { int mid; while(l<=r) { mid=(l+r)/2; if(dp[mid]>=x)l=mid+1; else if(dp[mid]<x)r=mid-1; } return l; } int main() { int n,m,i,j,T,len,k; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); len=0; for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(len==0){ dp[++len]=a[i];continue; } if(a[i]<=dp[len]){ dp[++len]=a[i];continue; } k=find(1,len,a[i]); dp[k]=a[i]; } for(i=1;i<=len;i++){ printf("%d ",dp[i]); } printf("\n"); //printf("%d\n",len); } return 0; }
标签:单调队列
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46127131