虽然标签上写的是树状数组和线段树,但蒟蒻树状数组刚学,线段树没学(大佬勿踩)。
码风极丑,勿喷。
附 提交记录
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,c;
int h[N],st[N],maxx[N][15],minx[N][15],x,y;
void stt(){
for(int i=1;i<=n;i++)
maxx[i][0]=minx[i][0]=h[i];
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n-(1<<i)+1;j++){
maxx[j][i]=max(maxx[j][i-1],maxx[j+(1<<i-1)][i-1]);
minx[j][i]=min(minx[j][i-1],minx[j+(1<<i-1)][i-1]);
}
}
int qjmax(int a,int b){
int x=st[b-a+1];
return max(maxx[a][x],maxx[b-(1<<x)+1][x]);
}
int qjmin(int a,int b){
int x=st[b-a+1];
return min(minx[a][x],minx[b-(1<<x)+1][x]);
}
int main(){
scanf("%d%d%d",&n,&m,&c);
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
for(int i=2;i<=n;i++)
st[i]=st[i>>1]+1;
stt();
for(int i=1;i<=n-m+1;i++){
int tmp1=qjmax(i,i+m-1);
int tmp2=qjmin(i,i+m-1);
if(tmp1-tmp2<=c)
printf("%d\n",i);
}
return 0;
}
谢谢大佬 Orz