线段树、优先队列、单调队列小结
主要处理问题:线段树:区间处理,一般需要对整个区间执行相同的操作,时间复杂度O(log(n))
优先队列:堆实现,找出最小或最大元素,或者第k小或第k大元素,一般区间内元素个数不变,只有个别元素会发生变化。时间复杂度O(log(n))
单调队列:设队列中元素从小到大,则如果要插入元素比队尾大,则直接入队。如果比队尾小,则队尾元素出队,直到发现队尾不比插入元素小或者队为空,再入队。
有规律的更新区间内元素,需要判定队头元素是否符合条件。可以处理最小或最大问题,或者第k小或第k大问题。时间复杂度O(n)
线段树推荐博客:http://www.notonlysuccess.com/index.php/segment-tree-complete/线段树模板:
//每次取出k个连续元素中最小值struct Queue{int pos;int w;Queue(){}Queue(int pos, int w): pos(pos), w(w){}}queue[nMax];int N, K;void update(){int front, rear;front = rear = 0;int i;for(i = 1; i <= N; ++ i){while(front != rear && queue[front - 1].w > A[i]) front --;//入队queue[front ++] = Queue(i, A[i]);if(i >= K){while(queue[rear].pos <= i - K)//排除rear ++;printf("%d ", queue[rear]);//取出数据}}}