单调队列模板

#define N 100100

/*
*****************_单调队列模板_******************/ //基于单调队列功能的单一性:以limit为序查找在一定范围内的极值。 //复杂度:O(n) //用法: 创建的时候调用.init() // 插入队列:.push( Q_Node( KEY,LIMIT ) ); // 设置limit值:.setlimit( LIMIT ); // 查询<limit值的最大元素: Q_Node qn; q2.top(qn); // 再查询前需要设置limit值,如果队列为空返回false,否则将最大元素存入qn中并返回true struct Q_Node { int key,limit;//用来比较大小的key和控制存在时间的limit Q_Node(){} Q_Node(int _key,int _limit){ key=_key,limit=_limit; } }; struct Q_Que { Q_Node Q[N]; int qf,qd; int limit;// <limit 的元素将被弹出 void init() { qf = qd = 0;//将队列内元素清空 } void push(Q_Node newnode) {//默认入队是当前limit最大的 while (qf>qd && Q[qf-1].key < newnode.key) qf--; Q[qf++] = newnode; } void setlimit(int _limit) { limit = _limit; } /* 取出队列中>=limit且key最大的元素。 */ bool top(Q_Node &rt) { while(qf>qd && Q[qd].limit < limit) qd++; if(qf==qd) return false; rt = Q[qd]; return true; } };

 

posted @ 2016-08-17 21:46  chenhuan001  阅读(200)  评论(0编辑  收藏  举报