线段树50分TLE求助

P1886 滑动窗口 /【模板】单调队列

小小蒟弱 @ 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

已过,谢大佬指点!


|