题解 P1886 【滑动窗口】

news/2024/7/6 0:11:44

我用的双端队列来做的

题意就不讲了吧。可以看出来最大值和最小值是同一个问题,改一下大于号和小于号就行了。所以我只讲怎么求最大值吧。

定义一个双端队列(相当于queue两端都可以插入或弹出,可以自行百度)

deque<pair> a,b;

pair的第一维被我称为时效性,第二位就是它自己的值。

每次操作,在前面弹出所以已失效的点;

然后再看队尾,如果点的值比当前p[i]小,也弹出;

最后把p[i]加到队尾

 a.push_back(make_pair(i+k-1,p[i]));

i+k-1就是她的时效性,p[i]是她的点值

然后最大值的操作就完了

(最小值就不讲了吧)

最后附上代码

#include<bits/stdc++.h>
using namespace std;
deque <pair<int,int> > a,b;
int n,k,p[1000005];
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>p[i];
    a.push_back(make_pair(k,p[1]));
    b.push_back(make_pair(k,p[1]));
    for(int i=2;i<=k-1;i++)
    {
        if(a.front().first<i) a.pop_front();
        while(!a.empty())
        {
            if(a.back().second>p[i])
            {
                a.pop_back();
                continue;
            }
            break;
        }
        a.push_back(make_pair(i+k-1,p[i]));
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        if(b.front().first<i) b.pop_front();
        while(!b.empty())
        {
            if(b.back().second<p[i])
            {
                b.pop_back();
                continue;
            }
                break;
        }   
        b.push_back(make_pair(i+k-1,p[i]));
    }
    for(int i=k;i<=n;i++)
    {
        while(!a.empty()&&a.front().first<i) a.pop_front();
    
        while(!a.empty())
        {
            if(a.back().second>p[i])
            {
                a.pop_back();
                continue;
            }
                break;
        }
        a.push_back(make_pair(i+k-1,p[i])); 
        cout<<a.front().second<<" ";
    }
    cout<<endl;
    for(int i=k;i<=n;i++)
    {
        while(!b.empty()&&b.front().first<i) b.pop_front();
        while(!b.empty())
        {
            if(b.back().second<p[i])
            {
                b.pop_back();
                    continue;
            }
                break;
        }
        b.push_back(make_pair(i+k-1,p[i]));
        cout<<b.front().second<<" ";
    }
    return 0;
}

转载于:https://www.cnblogs.com/lizinuo/p/10543879.html


http://www.niftyadmin.cn/n/3297889.html

相关文章

题解 CF1060B 【Maximum Sum of Digits】

先讲一下思路 首先输入一个数s; 然后要把S拆为AB&#xff1b; 那么&#xff0c;A的各个数位要尽可能大&#xff1b; 一&#xff1a;找出S的位数CNT,A加上CNT-1位9&#xff1b; 比如S2233213123的话&#xff0c;A一开始就等于 999999999 二&#xff1a;A的第一位为S第一位数字-1…

Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】 ...

http://www.blogjava.net/masfay/archive/2012/07/03/382080.html 前段时间细节的了解了Jedis的使用&#xff0c;Jedis是redis的java版本的客户端实现。本文做个总结&#xff0c;主要分享如下内容&#xff1a;【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【…

使用C++随机生成数据实战

题目地址 今天尝试了一下用C生成数据&#xff0c;参考了这篇文章。 主要过程是你需要先写一个标算 #include<bits/stdc.h> using namespace std; int ans; int main() {cout<<ans<<endl&#xff1b;return 0; } 接着使用这个程序 #include<iostream> #…

【缅怀妈妈系列诗歌】之十五:妈妈,请恕孩儿不孝

【缅怀妈妈系列诗歌】之十五&#xff1a;妈妈&#xff0c;请恕孩儿不孝题记&#xff1a;由于本想给妈妈的坟墓堆砌高一点、大一点、雄伟一点&#xff0c;因封建礼仪约束未能实现而感怀。谨以这一系列文章和诗歌缅怀我病逝的妈妈&#xff0c;祈祷她老人家在天能得以安息&#xf…

[Elasticsearch] 锁

字段折叠(Field Collapsing) 一个常见的需求是通过对某个特定的字段分组来展现搜索结果。我们或许希望通过对用户名分组来返回最相关的博文。对用户名分组意味着我们需要使用到terms聚合。为了对用户的全名进行分组&#xff0c;name字段需要有not_analyzed的原始值&#xff0c;…

面试题目--SQL 查100条数据中的30-40条

面试题目--SQL 查100条数据中的30-40条 分页sql查询在编程的应用很多&#xff0c;主要有存储过程分页和sql分页两种&#xff0c;我比较喜欢用sql分页&#xff0c;主要是很方便。为了提高查询效率&#xff0c;应在排序字段上加索引。 sql分页查询的原理很简单&#xff0c;比如你…

Redis集群技术分类

前言 诚如开篇文章所言&#xff0c;高效运维包括管理的专业化和技术的专业化。前两篇我们主要在说些管理相关的内容&#xff0c;本篇说一下技术专业化。希望读者朋友们能适应这个转换&#xff0c;谢谢。 互联网早在几年前就已进入Web 2.0时代&#xff0c;对后台支撑能力的要求&…

Pages.Instance is null when installing in subdirectory(ScrewTurn Wiki)

“/”应用程序中的服务器错误。 Pages.Instance is null 说明: 执行当前 Web 请求期间&#xff0c;出现未处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: Pages.Instance…