就是那个O(nlogn)的LIS算法。
#include <iostream> #include <cstdio> using namespace std; int dt[100005],dp[100005],num[100005]; int n,d; int bin(int a){ int l=1,r=n; int ans=0; while(l<=r){ int m=(l+r)/2; if(dt[m]<a){ ans=m; l=m+1; } else r=m-1; } return ans+1; } int main(){ while(scanf("%d%d",&n,&d)!=EOF){ for(int i=1;i<=n;i++){ dt[i]=100000000; scanf("%d",&num[i]); } int ans=0; for(int i=1;i<=n;i++){ dp[i]=bin(num[i]); if(dp[i]>ans) ans=dp[i]; int t=i-d; if(t>=1&&dt[dp[t]]>num[t]) dt[dp[t]]=num[t]; } printf("%d ",ans); } return 0; }