hdu 5489
题意:给出一个长度为n的数列,删去长度为l的子数列,问最长严格上升子序列
思路:我们可以求出每个数字以他为起点的上升序列长度q[i],然后我们可以得到在我这个数字a[i]在i-m之前的那些数的上升序列排第K个,那么就是K-1+q[i]。然而开始我求q[i]的时候,是这样想的,先求一遍正的LIS,最长长度为Max,那么q[i]=Max-他在子序列排第几位+1,WA到死,比如 5 7 6 4 9 ,4在第一位,9在第3位,然而以4为起点只有长度2
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 const int INF=1e9+10; 5 6 int a[N],b[N]; 7 int z[N],q[N]; 8 int dp[N]; 9 10 int main(){ 11 int t; 12 int n,m; 13 int k=1; 14 scanf("%d",&t); 15 while(t--){ 16 int Max=0; 17 scanf("%d%d",&n,&m); 18 for(int i=1;i<=n;i++) {scanf("%d",&a[i]);b[i]=-a[i];dp[i]=INF;} 19 for(int i=n;i>=1;i--){ 20 int k=lower_bound(dp+1,dp+1+n,b[i])-dp; 21 // cout<<b[i]<<" "<<k<<endl; 22 q[i]=k; 23 dp[k]=b[i]; 24 } 25 Max=0; 26 int y=0; 27 for(int i=1;i<=n;i++) dp[i]=INF; 28 for(int i=1;i<=n-m;i++){ 29 int k=lower_bound(dp+1,dp+1+n,a[i+m])-dp; 30 Max=max(Max,k-1+q[i+m]); 31 k=lower_bound(dp+1,dp+1+n,a[i])-dp; 32 dp[k]=a[i]; 33 y=max(y,k); 34 } 35 Max=max(Max,y); 36 printf("Case #%d: %d\n",k++,Max); 37 } 38 return 0; 39 }