线段树60pts求调
查看原帖
线段树60pts求调
687472
ZLQ20090921楼主2022/12/10 21:35
#include <bits/stdc++.h>
using namespace std;
const int N=1000005;
int mi[4*N],ma[4*N],a[N],n,m,c;
bool flag;
void build(int k,int l,int r){
	if(l==r){
		mi[k]=ma[k]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	mi[k]=min(mi[k*2],mi[k*2+1]);
	ma[k]=max(ma[k*2],ma[k*2+1]);
}
void change(int k,int l,int r,int x,int v){
	if(r<x||l>x)return;
	if(l==r&&l==x){
		mi[k]=ma[k]=v;
		return;
	}
	int mid=(l+r)/2;
	change(k*2+1,mid+1,r,x,v);
	change(k*2,l,mid,x,v);
	mi[k]=min(mi[k*2],mi[k*2+1]);
	ma[k]=max(ma[k*2],ma[k*2+1]);
}
int query_min(int k,int l,int r,int x,int y){
	if(y<l||x>r)return INT_MAX;
	if(x<=l&&r<=y)return mi[k];
	int mid=(l+r)/2;
	return min(query_min(k*2,l,mid,x,y),query_min(k*2+1,mid+1,r,x,y));
}
int query_max(int k,int l,int r,int x,int y){
	if(y<l||x>r)return 0;
	if(x<=l&&r<=y)return ma[k];
	int mid=(l+r)/2;
	return max(query_max(k*2,l,mid,x,y),query_max(k*2+1,mid+1,r,x,y));
}
int main(){
	cin>>n>>m>>c;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i+m<n;i++){
		int x=i,y=i+m-1;
		int minn=query_min(1,1,n,x,y),maxn=query_max(1,1,n,x,y);
		if(maxn-minn<=c)cout<<i<<endl,flag=1;
	}
	if(!flag)cout<<"NONE";
	return 0;
}

提交记录

2022/12/10 21:35
加载中...