【传送门: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 ",i-m+1),bk=true; if(bk==false) printf("NONE "); return 0; }