请求加强数据

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

zjrdmd @ 2020-08-04 19:48:24

开了o2线段树跑的飞快(最慢500ms)也没怎么卡常,请求加强数据qwq。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int

inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}

const int N=1e6+5;

int tree_min[N<<2],tree_max[N<<2],n,k,ans;
int a[N];

void build(int now,int l,int r){
    if(l==r){
        tree_min[now]=a[l],tree_max[now]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(now<<1,l,mid),build(now<<1|1,mid+1,r);
    tree_max[now]=tree_max[now<<1]>tree_max[now<<1|1]?tree_max[now<<1]:tree_max[now<<1|1];
    tree_min[now]=tree_min[now<<1]<tree_min[now<<1|1]?tree_min[now<<1]:tree_min[now<<1|1];
}

void query_min(int now,int l,int r,int x,int y){
    if(l>y||r<x)return;
    if(l>=x&&r<=y){
        ans=ans<tree_min[now]?ans:tree_min[now];
        return;
    }
    int mid=(l+r)>>1;
    query_min(now<<1,l,mid,x,y),query_min(now<<1|1,mid+1,r,x,y); 
}

void query_max(int now,int l,int r,int x,int y){
    if(l>y||r<x)return;
    if(l>=x&&r<=y){
        ans=ans>tree_max[now]?ans:tree_max[now];
        return;
    }
    int mid=(l+r)>>1;
    query_max(now<<1,l,mid,x,y),query_max(now<<1|1,mid+1,r,x,y); 
}

int main(){
    n=read(),k=read();
    for(ri i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(ri i=1;i<=n-k+1;i++){
        int l=i,r=i+k-1;
        ans=2100000000,query_min(1,1,n,l,r);
        printf("%d ",ans);
    }
    printf("\n");
    for(ri i=1;i<=n-k+1;i++){
        int l=i,r=i+k-1;
        ans=-2100000000,query_max(1,1,n,l,r);
        printf("%d ",ans);
    }
    return 0;
}

by feecle6418 @ 2020-08-04 19:50:30

@zjrqwq 模板题的意义是检验正确算法,而不是卡掉错误算法。其次,O(n)O(n\log n) 算法运行速度并无太大差别,我觉得线段树过了没有任何不合理之处。


by zjrdmd @ 2020-08-04 19:51:24

@Fee_cle6418 最起码线段树常数大一点啊像st表模板不就卡了线段树吗


by _998344353_ @ 2020-08-04 19:52:24

问题是本来2e7也能过啊(不考虑程序本身常数)


by Smile_Cindy @ 2020-08-04 19:52:47

可以考虑开到1e7


by zjrdmd @ 2020-08-04 19:54:32

@Alpha 附议qwq


by pomelo_nene @ 2020-08-04 20:10:40

后缀数组又不是只放dc3过。。。那道题 O(n \log n) 听同学说除了倍增 hash二分也可以随便做也没见过卡掉 O(n \log n)。。

st表和线段树时间复杂度相当。。。我觉得卡了没有什么意义。


by pomelo_nene @ 2020-08-04 20:11:32

所以这个题线段树过了也没有啥吧 反正模板题都是检验自己学会了没有吧


by Prean @ 2020-08-04 21:19:30

@SyadouHayami 然而我会单调队列,却连这道题都没过


|