蒟蒻求助,无法输出

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

help_guiyi @ 2023-02-14 15:14:31

代码见下

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
long long n,k,a[1000001],minx[1000001],maxx[1000001];
int main()
{
    memset(minx,1000001,sizeof(minx));
    memset(maxx,-1000001,sizeof(maxx));
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n;++i)
    scanf("%lld",&a[i]);
    int l=0,r=k-1;
    for(int l,r;r<n;++l,++r)
    {
        for(int j=l;j<=r;++j)
        {
            minx[l]=min(minx[l],a[j]);
            maxx[l]=max(a[j],maxx[l]);
        }
    }
    for(int i=0;i<l;++i)
    printf("%lld ",minx[i]);
    printf("\n");
    for(int i=0;i<l;++i)
    printf("%lld ",maxx[i]);
    return 0;
}

情况就是输入样例之后无法输出,哪位大佬帮看看代码


by olegekei @ 2023-02-14 15:19:03

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
long long n,k,a[1000001],minx[1000001],maxx[1000001];
int main()
{
    memset(minx,1000001,sizeof(minx));
    memset(maxx,-1000001,sizeof(maxx));
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n;++i)
    scanf("%lld",&a[i]);
    int l=0,r=k-1;
    for(;r<n;++l,++r)
    {
        for(int j=l;j<=r;++j)
        {
            minx[l]=min(minx[l],a[j]);
            maxx[l]=max(a[j],maxx[l]);
        }
    }
    for(int i=0;i<l;++i)
    printf("%lld ",minx[i]);
    printf("\n");
    for(int i=0;i<l;++i)
    printf("%lld ",maxx[i]);
    return 0;
}

by Rickrool @ 2023-02-14 15:19:23

@help_guiyi 您循环初始里有个 int l,r,所以接下来调用的是这个 r 而不是一开始设定的,然后又因为没初值还 ub 了


by 李宇涵 @ 2023-02-14 15:20:14

memset 的第二个参数好像是把内存中的每一字节都赋值成一样的东西,所以应该只能填 0255 之间的数。

超过 255 会发生什么我也不太清楚(很有可能未定义)


by 李宇涵 @ 2023-02-14 15:23:05

@help_guiyi 我帮你改好了代码

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
long long n,k,a[1000001],minx[1000001],maxx[1000001];
int main()
{
    memset(minx,0x3f,sizeof(minx));
    memset(maxx,0xf3,sizeof(maxx));
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n;++i)
    scanf("%lld",&a[i]);
    int l=0,r=k-1;// 在for外面定义了,在for里面就不要再定义了
    for(;r<n;++l,++r)
    {
        for(int j=l;j<=r;++j)
        {
            minx[l]=min(minx[l],a[j]);
            maxx[l]=max(a[j],maxx[l]);
        }
    }
    for(int i=0;i<l;++i)
    printf("%lld ",minx[i]);
    printf("\n");
    for(int i=0;i<l;++i)
    printf("%lld ",maxx[i]);
    return 0;
}

by help_guiyi @ 2023-02-14 15:24:04

@olegekei @Rickrool 谢谢大佬,能正常运行了,但是还是有两个点TLE了,请问还能怎么优化一下呢


by 李宇涵 @ 2023-02-14 15:24:40

@help_guiyi ???


by 李宇涵 @ 2023-02-14 15:24:56

@help_guiyi 用单调队列


by help_guiyi @ 2023-02-14 15:25:58

@李宇涵 谢谢大佬,memset好像是可以定义比255大的吧,但还是T了两个点


by 李宇涵 @ 2023-02-14 15:25:58

@help_guiyi here


by help_guiyi @ 2023-02-14 15:27:33

@李宇涵 明白,我去看看单调队列


| 下一页