当前位置: 代码迷 >> 综合 >> hud-3530-Subsequence-维护两个单调队列
  详细解决方案

hud-3530-Subsequence-维护两个单调队列

热度:74   发布时间:2023-12-19 10:40:23.0

维护两个单调队列,一个存储当前点之前的最大值。

另外一个存储当前点之前的最小值。

若最大值与最小值之间的差大于k,那么就把最大值和最小值中位置靠前的往后移。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
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<x)t1--;p[++t1]=pp;while(t2>=h2&&q[t2].val>x)t2--;q[++t2]=pp;while(p[h1].val-q[h2].val>k){if(p[h1].x<q[h2].x){last1=p[h1++].x;}else last2=q[h2++].x;}if(p[h1].val-q[h2].val>=m){ans=max(ans,i-max(last1,last2));}}cout<<ans<<endl;}return 0;
}


  相关解决方案