小小蒟弱 @ 2021-08-30 12:47:44
快读莫名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");
}
by Bowen123 @ 2021-08-30 12:56:16
单调队列的题为什么要用线段树啊
线段树10^6挺悬的,线段树常数很大
by Bowen123 @ 2021-08-30 12:57:18
@小小蒟弱 是在想用可以看一下第5篇题解
by 小小蒟弱 @ 2021-08-30 15:59:17
已过,谢大佬指点!