救救孩子

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

arekilldog @ 2019-08-16 11:42:35

第三点wa掉了

#include<bits/stdc++.h>
using namespace std;
deque<int> k1,k2;
vector<int> a;
int n,m,kk;

void Init(){
    cin>>n>>m;
    a.push_back(0);
    for(int i=1;i<=n;i++)
    {   
        cin>>kk;
        a.push_back(kk);
    }

}
int main(){
    Init();
    k1.push_back(a[1]);
    for(int i=2;i<=n;i++)
    {
        if(a[i]>k1.back())
        {
            k1.push_back(a[i]);
        }
        else
        {
            while(k1.empty()!=true&&a[i]<k1.back())
            {
                k1.pop_back();
            }
            k1.push_back(a[i]); 
        }
        if(i>=m)
        {
        cout<<k1.front()<<' ';
            if(k1.front()==a[i-m+1])
            {
                k1.pop_front();
            }
        }
    }
    cout<<endl;
    k2.push_back(a[1]);
    for(int i=2;i<=n;i++)
    {
        if(a[i]<k2.back())
        {
            k2.push_back(a[i]);
        }
        else
        {
            while(k2.empty()!=true&&a[i]>k2.back())
            {
                k2.pop_back();
            }
            k2.push_back(a[i]); 
        }
        if(i>=m)
        {
        cout<<k2.front()<<' ';
            if(k2.front()==a[i-m+1])
            {
                k2.pop_front();
            }
        }
    }
    return 0;
}
/*
8 3
1 3 -1 -3 5 3 6 7
*/

by arekilldog @ 2019-08-16 11:43:47

显示是(输出7,输出了个负数),这是咋回事,其他点都ac了??


by 生而为人 @ 2019-08-16 11:53:06

@arekilldog 您 能 用线段树 吗


by arekilldog @ 2019-08-16 11:57:12

@生而为人 很抱歉 不能orz


by arekilldog @ 2019-08-16 11:57:29

@生而为人 没学过 线段树 啊


by 生而为人 @ 2019-08-16 11:58:00

@arekilldog 啥? 线段树 维护 区间最值 不行??


by 生而为人 @ 2019-08-16 11:59:48

@arekilldog 论好板子的重要性

// luogu-judger-enable-o2
#include<iostream>
#include<deque>
using namespace std;
int a[1000005];
int n,k;
deque <int> q;
deque <int> p;
void work1()
{
    for(int i=1;i<=n;i++)
    {
        while(!q.empty()&&a[q.back()]>a[i])
        q.pop_back();
        while(!q.empty()&&i-q.front()>=k)
        q.pop_front();
        q.push_back(i);
        if(i>=k)
        cout<<a[q.front()]<<" ";
    }
}
void work2()
{
    for(int i=1;i<=n;i++)
    {
        while(!p.empty()&&a[p.back()]<a[i])
        p.pop_back();
        while(!p.empty()&&i-p.front()>=k)
        p.pop_front();
        p.push_back(i);
        if(i>=k)
        cout<<a[p.front()]<<" ";
    }
}
int main()
{
    ios::sync_with_stdio(false);

    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    work1();
    cout<<endl;
    work2();
    return 0;
}

by arekilldog @ 2019-08-16 12:07:29

@生而为人 但我就是百度也不懂线段树是什么啊qwq


by arekilldog @ 2019-08-16 13:10:08

救救孩子吧。。。 为什么单调队列会wa一个点


|