維護兩個單調隊列,一個存儲當前點之前的最大值。
另外一個存儲當前點之前的最小值。
若最大值與最小值之間的差大於k,那麼就把最大值和最小值中位置靠前的往後移。
#include#include #include #include #include using namespace std; //#define INF ((1<<30)-1) #define INF 0xfffff #define maxn 220000 #define LL long long #define MOD 1000000009 struct list { int val; int x; }p[maxn],q[maxn],pp; int main() { int n,m,k,i,x; while(~scanf("%d%d%d",&n,&m,&k)) { int h1,h2,t1,t2; h1=h2=1; t1=t2=0; int last1,last2,ans; ans=last1=last2=0; for(i=1;i<=n;i++) { scanf("%d",&x); pp.x=i; pp.val=x; while(t1>=h1&&p[t1].val =h2&&q[t2].val>x)t2--; q[++t2]=pp; while(p[h1].val-q[h2].val>k) { if(p[h1].x =m) { ans=max(ans,i-max(last1,last2)); } } cout<