1. 程式人生 > >BZOJ 1342: [Baltic2007]Sound靜音問題 | 單調隊列維護的好題

BZOJ 1342: [Baltic2007]Sound靜音問題 | 單調隊列維護的好題

clas puts 好題 個數字 單調隊列 main algorithm div fine

題目:

給n個數字,一段合法區間[l,l+m-1]要求max-min<=c

輸出所有合法區間的左端點,如果沒有輸出NONE


題解:

單調隊列同時維護最大值和最小值

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000005
using namespace std;
int n,m,c,Q[N],q[N],a[N],Ql,Qr,ql,qr,OK;
int main()
{
    scanf("%d%d%d",&n,&m,&c);
    for (int
i=1;i<=n;i++) scanf("%d",a+i); q[0]=Q[0]=1; for (int i=1;i<=n;i++) { while (Ql<=Qr && Q[Ql]<=i-m) Ql++; while (ql<=qr && q[ql]<=i-m) ql++; while (Ql<=Qr && a[Q[Qr]]<a[i]) Qr--;Q[++Qr]=i; while (ql<=qr && a[q[qr]]>a[i]) qr--;q[++qr]=i;
if (a[Q[Ql]]-a[q[ql]]<=c && i>=m) OK=1,printf("%d\n",i-m+1); } if (!OK) puts("NONE"); return 0; }

BZOJ 1342: [Baltic2007]Sound靜音問題 | 單調隊列維護的好題