线段树求助
查看原帖
线段树求助
334935
youyi2008楼主2022/7/26 16:16
#include<iostream>
using namespace std;

const int N=1e6+1;
int n,k;
int a[N];
namespace Max{
struct node
{
	int l,r;
	int v;
}tr[N*4];

void pushup(int x)
{
	tr[x].v=max(tr[x<<1].v,tr[x<<1|1].v);
}

void build(int u,int l,int r)
{
	tr[u].l=l,tr[u].r=r;
	if(l==r)
	{
		tr[u].v=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r)	
		return tr[u].v;
	int mid=l+r>>2;
	int v=-0x3f3f3f3f;
	if(tr[u<<1].r>=l)
		v=query(u<<1,l,r);
	if(tr[u<<1|1].l<=r)
		v=max(v,query(u<<1|1,l,r));
	return v;
}
}
namespace Min{
struct node
{
	int l,r;
	int v;
}tr[N*4];

void pushup(int x)
{
	tr[x].v=min(tr[x<<1].v,tr[x<<1|1].v);
}

void build(int u,int l,int r)
{
	tr[u].l=l,tr[u].r=r;
	if(l==r)
	{
		tr[u].v=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r)	
		return tr[u].v;
	int mid=l+r>>2;
	int v=0x3f3f3f3f;
	if(tr[u<<1].r>=l)
		v=query(u<<1,l,r);
	if(tr[u<<1|1].l<=r)
		v=min(v,query(u<<1|1,l,r));
	return v;
}
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	Min::build(1,1,n);
	Max::build(1,1,n);
	for(int i=1;i<=n-k+1;i++)
		cout<<Min::query(1,i,i+k-1)<<" ";
	cout<<endl;
	for(int i=1;i<=n-k+1;i++)
		cout<<Max::query(1,i,i+k-1)<<" ";
}

为什么我查询的时候右移了两位还AC了? https://www.luogu.com.cn/record/79773804

2022/7/26 16:16
加载中...