p4392,st表WA#3,蒟蒻求助。(玄关2)
  • 板块学术版
  • 楼主ForEly
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/18 22:05
  • 上次更新2023/12/19 12:49:53
查看原帖
p4392,st表WA#3,蒟蒻求助。(玄关2)
946218
ForEly楼主2023/12/18 22:05

虽然标签上写的是树状数组和线段树,但蒟蒻树状数组刚学,线段树没学(大佬勿踩)。

码风极丑,勿喷。

附 提交记录

#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

2023/12/18 22:05
加载中...