BZOJ1342: [Baltic2007]Sound静音问题

【传送门:BZOJ1342


简要题意:

  给出n个数的序列,要选出连续m个数,使得这些数的最大值-最小值<=c

  求出所有m个数的序列的第一个数的位置,如果没有输出NONE


题解:

  直接单调队列,不解释


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
struct node
{
    int x,p;
}list[1100000];
int a[1100000];
int f1[1100000],f2[1100000];
int main()
{
    int n,m,c;
    scanf("%d%d%d",&n,&m,&c);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int head=1,tail=1;
    for(int i=1;i<=n;i++)
    {
        while(head<=tail&&i-list[head].p>=m) head++;
        while(head<=tail&&a[i]>=list[tail].x) tail--;
        tail++;list[tail].x=a[i];list[tail].p=i;
        if(i>=m) f1[i]=list[head].x;
    }
    head=1;tail=1;
    for(int i=1;i<=n;i++)
    {
        while(head<=tail&&i-list[head].p>=m) head++;
        while(head<=tail&&a[i]<=list[tail].x) tail--;
        tail++;list[tail].x=a[i];list[tail].p=i;
        if(i>=m) f2[i]=list[head].x;
    }
    bool bk=false;
    for(int i=m;i<=n;i++) if(f1[i]-f2[i]<=c) printf("%d\n",i-m+1),bk=true;
    if(bk==false) printf("NONE\n");
    return 0;
}
posted @ 2018-04-12 16:06  Star_Feel  阅读(139)  评论(0编辑  收藏  举报