社区讨论

线段树50分TLE求助

P1886【模板】单调队列 / 滑动窗口参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lobv9qde
此快照首次捕获于
2023/10/30 03:31
2 年前
此快照最后确认于
2023/11/04 08:33
2 年前
查看原帖
快读莫名30分TLE。。。
CPP
#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");
}

回复

3 条回复,欢迎继续交流。

正在加载回复...