📜  门| GATE CS 2011 |问题18(1)

📅  最后修改于: 2023-12-03 14:58:19.545000             🧑  作者: Mango

门 | GATE CS 2011 | 问题18

本题源自于2011年GATE计算机科学考试。

题目描述

给定数列$A = {a_1, a_2, ..., a_n}$,以及另一个数列$P = {p_1, p_2, ..., p_n}$,每个$p_i$表示在数列$A$中,$a_i$之后最小的比$a_i$大的数的下标。设$q_i$表示从$a_i$开始,到下标为$p_i$的数(不含$p_i$)之间所有数的和。例如,对于数列$A = {3,1,4,2}$,数列$P = {3,3,4,4}$,则$q_1=4+2=6, q_2=1, q_3=2, q_4=2$。

现在,给定数列$A$和$P$,请写出一个函数sumFromArray(A, P),将所有$q_i$的和作为结果返回。

输入格式
  • 两个长度相同的整数数列$A$,$P$,每个数列元素用空格隔开。
  • $1 \leq n \leq 10^5, 0 \leq a_i \leq 10^6, 1 \leq p_i \leq n$。
输出格式
  • 返回值为一个整数,表示所有$q_i$的和。
输入样例
3 1 4 2
3 3 4 4
输出样例
11
解题思路

我们可以考虑从前到后遍历整个数列$A$,每找到一个位置$i$,就求出$q_i$并把它加到一个累加器里。具体来说,我们可以先令$s=0$,然后用一个while循环处理每一个位置$i$,直到i>n。循环的主体部分可以写成下面这个样子(其中$p_i$是按照可能空缺的方式处理,保证$p_i ≤ n$):

while i ≤ n do
    s += a[i]
    i = p[i] + 1
end while
代码实现
def sumFromArray(A, P):
    n = len(A)
    s = 0
    i = 0
    while i < n:
        s += A[i]
        i = P[i] + 1 if P[i] < n else n
    return s

代码片段按markdown标明以供复制或显示:

```python
def sumFromArray(A, P):
    n = len(A)
    s = 0
    i = 0
    while i < n:
        s += A[i]
        i = P[i] + 1 if P[i] < n else n
    return s