2011年10月27日
摘要: POJ_2828 这个题目和POJ_2182很像,我们可以从后往前依次查询,排在p的右边就说明自己是排在第p+1位的,因此,我们可以维护一个线段树,节点值表示当前区间内还有多少个位置,寻找到当前第p+1个位置的所在地时,就把value存进去,然后把这个位置删除,即自底向上更新一遍节点值即可。#include<stdio.h>#include<string.h>#define MAXD 200010int tree[4 * MAXD], q[MAXD], a[MAXD], b[MAXD], N, M;void init(){ int i, j; for(M = 1; M 阅读全文
posted @ 2011-10-27 16:20 Staginner 阅读(386) 评论(2) 推荐(0) 编辑
摘要: POJ_2182 没想到线段树也可以这么用,确实线段树太灵活了…… 这个题目可以转化成从后向前依次查询,比如当前奶牛的前面有x个号码比它小的奶牛,那么它就应该在剩余的数的序列中排第x+1。因此,我们可以维护一个线段树,节点值表示当前区间内还有多少个数,当寻找第x+1大的数时,可以自顶向下查找,找到之后删去这个数,即自底向上更新一遍节点的值即可。#include<stdio.h>#include<string.h>#define MAXD 8010int tree[4 * MAXD], N, M, q[MAXD];void init(){ int i, j; memset 阅读全文
posted @ 2011-10-27 15:38 Staginner 阅读(386) 评论(0) 推荐(0) 编辑
摘要: POJ_3264 这是一个RMQ问题,可以直接用线段树处理出区间的最大及最小值,在O(logN)的时间完成每次的查询操作。#include<stdio.h>#include<string.h>#define MAXD 130000#define INF 1000000000int a[MAXD], b[MAXD], N, Q, M;void init(){ int i, j, k; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(M = 1; M < N + 2; M <<= 1); for( 阅读全文
posted @ 2011-10-27 00:58 Staginner 阅读(205) 评论(0) 推荐(0) 编辑