不开O2第二个点会TLE,请问在不开O2的情况下,怎么才能AC?

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

Ender_Fish @ 2022-08-10 21:03:50

我用的是大根堆和小根堆,不开O2是1.20秒。请问怎么优化?

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int val,i;
    bool operator < (const node& n1) const{
    return val<n1.val;
    }
    bool operator > (const node& n1) const{
    return val>n1.val;
    }
}a[1000005];
priority_queue<node> q;
priority_queue<node,vector<node>,greater<node> > q1;

int n,k;
int main()
{
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].val);
        a[i].i=i;
    }
    for(int i=1;i<=k;i++)
    {
        q1.push(a[i]);
    }
    for(int i=k;i<=n;i++)
    {
        while(q1.top().i<i-k+1)
        {
            q1.pop();
        }
        printf("%d ",q1.top().val);
        //cout<<q1.top().val<<" ";//最小值
        if(i+1<=n)
        {
            q1.push(a[i+1]);
        }
    }
    cout<<'\n';
    for(int i=1;i<=k;i++)
    {
        q.push(a[i]);
    }
    for(int i=k;i<=n;i++)
    {
        while(q.top().i<i-k+1)
        {
            q.pop();
        }
        printf("%d ",q.top().val);
        //cout<<q.top().val<<" ";//最大值
        if(i+1<=n)
        {
            q.push(a[i+1]);
        }
    }
    return 0;
}

by Hisaishi_Kanade @ 2022-08-10 21:04:48

使用单调队列


by HarryKane @ 2022-08-10 21:05:08

为什么不开 O2


by Hisaishi_Kanade @ 2022-08-10 21:05:54

复杂度实际上是不合理的


by Hisaishi_Kanade @ 2022-08-10 21:07:22


by Hisaishi_Kanade @ 2022-08-10 21:09:51

@HarryKane lz想知道这个代码为啥如此喜氧


by Super_Supper @ 2022-08-10 21:30:49

@Ender_Wish O2 优化,优先队列时间复杂度高


by Super_Supper @ 2022-08-10 21:31:14

口误,常数高


by Ender_Fish @ 2022-08-10 21:59:18

@HarryKane 因为考试不给开啊(好像是这样的吧,我以前没有参加过考试)


by Ender_Fish @ 2022-08-10 22:00:38

@sb_yyds 谢谢了,我以后改别的方法做吧


by Super_Supper @ 2022-08-11 12:14:26

@Ender_Wish 公开赛一般都开的吧。。。


| 下一页