70分求助 4,5,7WA(发过一次没人回,加了一点注释QwQ)
查看原帖
70分求助 4,5,7WA(发过一次没人回,加了一点注释QwQ)
605603
qwerzxjj楼主2022/7/14 16:30
#include <bits/stdc++.h>
using namespace std;
int m,n;
int a[1000001];//用于储存输入序列
deque <int> p,q;
void da()//求最大值,最小值同理
{
    p.push_back(a[1]);
    for(int i = 2;i <= n;i++)
    {
        while(a[i] >= p.front() && !p.empty())
        {
            p.pop_front();
        }
        p.push_back(a[i]);

    }//求出第一个窗口里的最大值并构建其单调队列
    cout << p.front() << " ";
    for(int i = 1;i <= m - n;i++)
    {
        if(a[i] == p.front())//滑出窗口的是最大值,队首出队
        {
            p.pop_front();
        }
        while(a[n+i] >= p.back() && !p.empty())//为保证单调性,只在队尾大于新进入值时让新进入值入队
        {
            p.pop_back();
        }
        p.push_back(a[n+i]);
        cout << p.front() << " ";
    }
}
void xiao()
{
    q.push_back(a[1]);
    for(int i = 2;i <= n;i++)
    {
        while(a[i] <= q.front() && !q.empty())
        {
            q.pop_front();
        }
        q.push_back(a[i]);
        
    }
    cout << q.front() << " ";
    for(int i = 1;i <= m - n;i++)
    {
        if(a[i] == q.front())
        {
            q.pop_front();
        }
        while(a[n+i] <= q.back() && !q.empty())
        {
            q.pop_back();
        }
        q.push_back(a[n+i]);
        cout << q.front() << " ";
    }
    cout << endl;
}
int main()
{
    cin >> m >> n;
    for(int i = 1;i <= m;i++)
    {
        cin >> a[i];
    }
    xiao();
    da();
    return 0;
}
2022/7/14 16:30
加载中...