poj 2823 Sliding Window

来源:互联网 发布:网络爬虫 登陆 编辑:程序博客网 时间:2024/05/29 08:17

单调队列的应用。

#include <cstdio>#include <deque>#include <iostream> using namespace std;#define max_n 1000005#define inf 0x3f3f3f3fdeque<int> m_min,m_max;int data[max_n];int n,k;void getmax();void getmin();int main(){scanf("%d%d",&n,&k);for(int i = 1;i<=n;i++)scanf("%d",&data[i]);getmin();getmax();}void getmin(){data[0] =  inf;m_min.push_back(0);for(int i=1;i<=n;i++){if(data[i]>=data[m_min.back()]){m_min.push_back(i);}else{do{m_min.pop_back();}while(!m_min.empty()&&data[m_min.back()]>data[i]);m_min.push_back(i);}if(i-m_min.front()+1>k)m_min.pop_front();if(i>=k){printf("%d ",data[m_min.front()]);}}printf("\n"); }void getmax(){data[0] =  -inf;m_max.push_back(0);for(int i=1;i<=n;i++){if(data[i]<=data[m_max.back()]){m_max.push_back(i);}else{do{m_max.pop_back();}while(!m_max.empty()&&data[m_max.back()]<data[i]);m_max.push_back(i);}if(i-m_max.front()+1>k)m_max.pop_front();if(i>=k){printf("%d ",data[m_max.front()]);}}printf("\n"); }


0 0