poj 2823, 多次查询的问题,
问题:
给定二个数, 一个是数组的个数N, 一个数k. 从数组开头,一步一步前进的,每次取k个数,计算出其他的最大值及最小值。
最后就是输出所有的最大值,最小值,
比如,
8 3 1 3 -1 -3 5 3 6 7
第一次是, 1 3 -1, 所以最小值为-1,最大值是3
第二次是, 2 -1 -3 所以最小值为-3,最大值是2
。。。
复习下线段树,写了没什么效率的线段树。。。
#include <stdio.h> #include <stdlib.h> #define MAX 1000001 struct LineTree { int maxVal; int minVal; int value; int start; int end; }; LineTree array[MAX * 5 + 1]; int data[MAX]; int maxOutput[MAX]; int minOutput[MAX]; int nStartPos = 0; void BuildTree(int index, int start, int end) { array[index].start = start; array[index].end = end; if(start == end) { array[index].maxVal = array[index].minVal = data[nStartPos]; array[index].value = data[nStartPos]; nStartPos ++; return; } // 回溯建左右子树 int mid = (start + end) / 2; BuildTree(2*index, start, mid); BuildTree(2*index + 1, mid + 1, end); array[index].maxVal = array[2*index].maxVal > array[2*index + 1].maxVal ? array[2*index].maxVal:array[2*index + 1].maxVal; array[index].minVal = array[2*index].minVal < array[2*index + 1].minVal ? array[2*index].minVal:array[2*index + 1].minVal; } void FindValue(int index, int start, int end, int &max, int &min) { int istart = array[index].start; int iend = array[index].end; if(istart == start&& iend == end) { max = array[index].maxVal; min = array[index].minVal; return; } int nMid = (istart + iend)/2; // 在左子树找 if(nMid >= end) { FindValue(2*index, start, end, max, min); } else if(nMid < start) { FindValue(2*index + 1, start, end, max, min); } else { int max1 = 0, min1 = 0; FindValue(2*index, start, nMid, max1, min1); int max2 = 0, min2 = 0; FindValue(2*index + 1, nMid + 1, end, max2, min2); max = max1 > max2 ? max1: max2; min = min1 < min2 ? min1: min2; } } int main() { int n,k; while(scanf("%d%d", &n, &k) != EOF) { nStartPos = 0; for(int i = 0; i < n; i ++) { scanf("%d", &data[i]); } BuildTree(1, 1, n);; int nTime = n - k + 1; for(int i = 0; i < nTime; i ++) { FindValue(1, i + 1, i + k, maxOutput[i], minOutput[i]); } for(int i = 0; i < nTime; i ++) { printf("%d ", minOutput[i]); } printf("\n"); for(int i = 0; i < nTime; i ++) { printf("%d ", maxOutput[i]); } printf("\n"); } return 0; }