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;
}