线段树50分TLE求助
查看原帖
线段树50分TLE求助
447492
小小蒟弱楼主2021/8/30 12:47

快读莫名30分TLE。。。

#include <bits/stdc++.h>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
struct ST
{
	int l,r,dat;
}a[4000005];
int t[1000005],n;
void build(int p,int l,int r,int b)
{
	a[p].l=l;
	a[p].r=r;
	if(l==r)
	{
		a[p].dat=t[l];
		return ;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid,b);
	build(p*2+1,mid+1,r,b);
	if(b==1) a[p].dat=max(a[p*2].dat,a[p*2+1].dat);
	if(b==0) a[p].dat=min(a[p*2].dat,a[p*2+1].dat);
}
int ask(int p,int l,int r,int b)
{
	if(l<=a[p].l&&r>=a[p].r) return a[p].dat;
	int mid=(a[p].l+a[p].r)/2,maxn=-1<<30,minn=1<<30;
	if(b==1)
	{
		if(l<=mid) maxn=max(ask(p*2,l,r,b),maxn);
		if(r>mid) maxn=max(ask(p*2+1,l,r,b),maxn);
		return maxn;
	}
	if(b==0)
	{
		if(l<=mid) minn=min(ask(p*2,l,r,b),minn);
		if(r>mid) minn=min(ask(p*2+1,l,r,b),minn);
		return minn;
	}
}
int main()
{
	int i,m;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) scanf("%d",&t[i]);
	build(1,1,n,0);
	for(i=1;i<=n-m+1;i++) printf("%d ",ask(1,i,i+m-1,0));
	printf("\n");
	build(1,1,n,1);
	for(i=1;i<=n-m+1;i++) printf("%d ",ask(1,i,i+m-1,1));
	printf("\n");
}
2021/8/30 12:47
加载中...