摘要: http://wikioi.com/problem/1063/这题是贪心+堆。主要想练习一下堆的写法。算法导论里的方法名是heapify()等,但大家经常用更直观的down(), up()方法(向上,下调整),根据这两个方法,可以有build,insert,getmin方法。向下调整的代码稍微需要判断一下左右子树是否越界,其他都很简单。#include using namespace std;#define LEN 10005int num[LEN];int size;void swap(int a, int b) { int tmp = num[a]; num[a] = num[... 阅读全文
posted @ 2013-11-10 22:46 阿牧遥 阅读(267) 评论(0) 推荐(0)
摘要: 这是一个经典的单调序列的使用。单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作:1、入队:如果当前元素要进队,把当前元素和队尾元素比较,如果当前元素小于队尾元素,那么当前元素直接进队,如果当前元素大于队尾元素,那么队尾出队,将当前元素和新的队尾再做比较,直到当前元素大于队尾元素或者队列为空。单调队列只能在队尾插入元素,队尾和队头都可以删除元素。2、出队:出队直接取队头即可,因为用单调队列就是为了取最值,而队头就是最值。因为每个元素都出队列进队列一次,而且进出没有多余的比较,所以平摊下来是O(n)的 阅读全文
posted @ 2013-11-10 21:20 阿牧遥 阅读(223) 评论(0) 推荐(0)