一、题目
蒜头君有 n 个数,他提出了 q 个问题,每个问题是说,询问前 x 个数的极差(最大值减最小值)。你能帮助他解决这 q 个问题吗?
输入格式:
第一行两个整数 n,q(1 ≤ n,q ≤ 105 )
第二行 n 个整数 ai (1 ≤ ai ≤ 109 ) 表示蒜头君的 n 个数
第三行 q 个整数 xi (1 ≤ xi ≤ n) ,表示每一次询问
输出格式:
输出一行,包含 q 个整数,表示每一次询问的答案
数据范围:
对于 60% 的数据, 1 ≤ n,q ≤ 103
对于 100% 的数据,1 ≤ n,q ≤ 105
Inputcopy:
5 5
3 2 4 5 1
1 2 3 4 5
Outputcopy;
0 1 2 3 4
二、方法一
1、思路
用两个数组分别存放前 i 个数中的最大值和最小值,然后用一个数组来存放极差(打表),然后询问即可。
2、代码
#include<stdio.h>
#define Max 100005
int n, q; // n 个数,p 次提问
int i, j, k; // 遍历
int max[Max], min[Max]; // max存放最大值,min存放最小值
int a[Max]; // n 个数的数组
int b[Max]; // 存放前 n 个数的极值
int x;
int main()
{
scanf("%d %d", &n, &q);
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (i == 1)
max[i] = a[i], min[i] = a[i];
else
{
max[i] = max[i - 1] > a[i] ? max[i - 1] : a[i];
min[i] = min[i - 1] < a[i] ? min[i - 1] : a[i];
}
b[i] = max[i] - min[i];
}
for (i = 1; i < q; i++)
{
scanf("%d", &x);
printf("%d ", b[x]);
}
scanf("%d", &x);
printf("%d", b[x]);
return 0;
}