首页 > 其他分享 >单调队列

单调队列

时间:2022-12-28 12:45:13浏览次数:26  
标签:cout 队列 back cin int 最小值 滑动 单调

单调队列可以求解滑动窗口的最大值和最小值问题,或者处理可加信息。(别忘了第一个)

P1886

有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f(i, a, b) for(int i = (a); i <= (b); i++)
#define cl(i, n) i.clear(),i.resize(n);
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 1e9;
void cmax(int &x, int y) {if(x < y) x = y;}
void cmin(int &x, int y) {if(x > y) x = y;}
int a[1000100];
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    //time_t start = clock();
    //think twice,code once.
    //think once,debug forever.
    int n,k;cin>>n>>k;
    f(i,1,n)cin>>a[i];
    deque<int> q;

    
    f(i, 1, k) {
        while(!q.empty() && a[q.back()] >= a[i]) q.pop_back();
        q.push_back(i);
    }
    cout << a[q.front()] << " ";
    for(int i = 2, j = k + 1; i <= n - k + 1; i ++, j ++) {
        while(!q.empty() && q.front() < i) q.pop_front();
        while(!q.empty() && a[q.back()] >= a[j]) q.pop_back();
        q.push_back(j);
        cout << a[q.front()] << " ";
    }      
    cout << endl;    while(!q.empty()) q.pop_back();
    f(i, 1, k) {
        while(!q.empty() && a[q.back()] <= a[i]) q.pop_back();
        q.push_back(i);
    }
    cout << a[q.front()] << " ";
    for(int i = 2, j = k + 1; i <= n - k + 1; i ++, j ++) {
        while(!q.empty() && q.front() < i) q.pop_front();
        while(!q.empty() && a[q.back()] <= a[j]) q.pop_back();
        q.push_back(j);
        cout << a[q.front()] << " ";
    }  
    cout << endl;
    //time_t finish = clock();
    //cout << "time used:" << (finish-start) * 1.0 / CLOCKS_PER_SEC <<"s"<< endl;
    return 0;
}

如何求任意一个固定大小的矩形的最小值?
考虑 \(s_{i,j}\) 表示 \(a_{i,j,...,j+len-1}\) 的最小值,\(t_{i,j}\) 表示 \(s_{i,...,i+len-1,j}\) 的最小值即可。

标签:cout,队列,back,cin,int,最小值,滑动,单调
From: https://www.cnblogs.com/Zeardoe/p/17009893.html

相关文章

  • RabbitMQ从入门到精通-工作队列-Work Queues
         工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队......
  • 力扣225 用队列实现栈
    题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。实现MyStack类:voidpush(intx)将元素x压入栈顶。......
  • 力扣232 用栈实现队列
    题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾......
  • 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue使用场景总结
    适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。当许......
  • 3 栈和队列
    栈:只允许在一端进行插入或删除操作的线性表操作特性:后进先出(LIFO)顺序栈共享栈链栈基本运算:初始化、判栈空、进栈、出栈、读栈顶元素 队列:只允许在表的一端进行......
  • AQS抽象队列同步器
    AbstractQueuedSynchronizer抽象的队列同步器AQS是volatile+CAS机制实现的锁模板,保证了代码的同步性和可见性。AQS定义了一套多线程访问共享资源的同步器框架,封装了线程......
  • 根据身高重建队列
    假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表示第i个人的身高为hi,前面正好有ki个身高大于......
  • 消息队列
    消息队列就是一些消息的列表。用户可以在消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。同......
  • Windows服务器【由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作】
    原文:Windows服务器【由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作】问题调查-奋斗的大橙子-博客园(cnblogs.com)因为我的服务器上也遇到了这个问题,经查......
  • 单调栈
    title:单调栈date:2022-11-1720:33:16tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博......