zoukankan      html  css  js  c++  java
  • 单调队列 滑动窗口模型

    作用:快速取出[i,j]区间中的极值  

    最大:单减

    最小:单增

    取队首

    乱序中求极值

    1. 二分(有序)

    2.维护单调性   : 单调队列(有序)

     例题 nkoj 2152【单调队列】滑动窗口

    时间限制 : 10000 MS   空间限制 : 65536 KB

    // 
    #include<bits/stdc++.h> 
    using namespace std;
    #define maxn  1000070 
    struct node
    {
    	int num,id;
    };
    node mm[maxn];
    int ans[1000070],ans1[1000070];
    int main()
    {	deque <node> Q;
    	deque <node> K;
    	int n,k;
    	cin>>n>>k;
    	for(int i=1;i<=n;i++)
    {	
    	cin>>mm[i].num;
    	mm[i].id=i;
    }
    K.push_back(mm[1]);
    Q.push_back(mm[1]);
    	for(int j=2;j<=n;j++)
    	{
    		while(Q.size()&&Q.back().num<=mm[j].num) Q.pop_back();
    		Q.push_back(mm[j]);
    		while(Q.front().id<=j-k) Q.pop_front();
    		if(j>=k) ans[j]=Q.front().num;
    	}
    	for(int j=2;j<=n;j++)
    	{
    		while(K.size()&&K.back().num>=mm[j].num) K.pop_back();
    		K.push_back(mm[j]);
    		while(K.front().id<=j-k) K.pop_front();
    		if(j>=k) ans1[j]=K.front().num;
    	}
    		for(int j=k;j<=n;j++)
    {
    	cout<<ans1[j]<<" ";
    }cout<<endl;
    	for(int j=k;j<=n;j++)
    {
    	cout<<ans[j]<<" ";
    }
    	}


    多路合并问题:
    nkoj 3765
    构矩形
    有序用堆+sum id 构造函数 选n个

    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    idea 找不到包或找不到符号
    JOISC部分题解
    欧拉数学习笔记
    [清华集训2017]生成树计数
    [ZJOI2019]开关
    【题解】CF817E Choosing The Commander
    CSP-S 2020游记
    【学习笔记】线段树合并
    【题解】[IOI2005]Riv 河流
    【题解】哈希冲突
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11069198.html
Copyright © 2011-2022 走看看