1 条题解

  • 0
    @ 2025-8-24 22:54:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar cff_0102
    & aqua_qaq | 团子群 185800038 | 如果我死了说明我 AFO 了

    搬运于2025-08-24 22:54:31,当前版本为作者最后更新于2024-01-21 23:35:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

    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)
    

    注意:

    • 右移整个序列,相当于左移现序列的第一个数在原序列中的位置。
    • 输入的数据是下标从 11 开始的。
    • 1

    信息

    ID
    9011
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者