#includeint main() { int n = 0, k = 0, max = 0, min = 0, number = 0;; int num[100000], numB[100000]; //n来限制输入数字的个数,k用来表示询问的次数 //max来存储随着输入数字的极大值的更改,min是极小值 //number用来存储之后询问所输入的数字 scanf("%d %d", &n, &k); scanf("%d", &num[0]); max = num[0]; min = num[0]; numB[1] = max - min; //numB从下标为1的位置开始存储,因为数字个数没有可能是0 //num存储输入的数字,numB存储对应下标个数数字的极差 for (int i = 1; i < n; i++) { scanf("%d", &num[i]); if (num[i] > max) { max = num[i]; } if (num[i] < min) { min = num[i]; } numB[i + 1] = max - min; //每输入一个数字,就对numB进行一次计算 } k--; scanf("%d", &number); printf("%d", numB[number]); while (k!=0) { scanf("%d", &number); printf(" %d", numB[number]); } }
对于这道题来说,直接对输入的数字进行极差运算比之后询问是再进行计算的时间效率要高很多,如果在输入完数字之后对于询问的会报超时
思路非常简单
首先对数据进行输入,并且随着数据的输入对于不同数量数字进行极差运算,存储在集合numB中,所以当进行询问的时候直接打印numB所对应位置的极差就可以



