HDU-3530-Subsequence
阿新 • • 發佈:2019-02-13
單調佇列很好的一個題目,我卻傻逼的用佇列寫了好久,最後才發現自己腦殘了。
程式碼:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; const int maxn=1e6+100; int n,m,k,a[maxn],pre1,pre2,last1,last2,q1[maxn],q2[maxn]; int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); int pre=1,ans=0; pre1=pre2=last1=last2=0; for(int i=1;i<=n;i++) { while(pre1<last1&&a[q1[last1-1]]<a[i]) last1--; while(pre2<last2&&a[q2[last2-1]]>a[i]) last2--; q1[last1++]=i; q2[last2++]=i; while(pre1<last1&&pre2<last2&&a[q1[pre1]]-a[q2[pre2]]>k) { if(q1[pre1]<q2[pre2]) pre=q1[pre1++]+1; else pre=q2[pre2++]+1; } if(pre1<last1&&pre2<last2&&a[q1[pre1]]-a[q2[pre2]]>=m) ans=max(ans,i-pre+1); } printf("%d\n",ans); } return 0; }