P10086 [ROIR 2022 Day 1] 口算比赛 题解

· · 题解

因为最后只需要输出序列的数字总和,所以循环右移的时候,实际上并不需要真正的位移。可以用一个变量 x 存储位移后新序列的第一个数在原序列的哪个位置,修改的时候将修改的位置加上这个变量再对序列长度取模,就能得到这一步修改的是原序列的哪个位置,然后在原序列上修改。

计算新的数字和时,也不需要从头到尾算一遍。因为一次只改一个数,所以新的数字和 s'=s-a+a',其中 s 是原数字和,a 是被修改的位置原来的数,a' 是这个位置要修改成哪个数字。

n=int(input())
a=list(map(int,input().split()))
q=int(input())
x=0 # 位移后新序列的第一个数在原序列的哪个位置
ans=0
for i in a:
    ans+=i # 计算原序列的数字和
while q:
    q-=1
    s=list(map(int,input().split()))
    if s[0]==2:
        x-=s[1]
        x+=n
        x%=n
    else:
        p=(x+s[1]-1)%n
        ans-=a[p]
        a[p]=s[2]
        ans+=a[p]
    print(ans)

注意: