1 条题解

  • 0
    @ 2026-5-2 12:51:00

    思路

    这种题也是老生常谈,我们可以用一个变量 sumsum 来记录 ai\sum a_i 的值,每次操作 22 就用 sumsum 减去 aia_i 加上 xx 就可以 O(1)O(1) 正确更新 sumsum,注意此时 aia_i 的值也要更新为 xx,因为还有后续操作。

    再考虑操作 11,如何也 O(1)O(1) 完成并能和操作 22 配合呢?于是我们就可以设一个变量 jljl 来记录向右移动的位数,移动超过了 nn 位就相当于移动了 jlmodnjl\bmod n 位。

    再反观操作 22,这时我们就可以这样想,现在让你修改的是向右移动 jljl 位后的 ii 位,其实就是原先的 (ijl+n)modn(i-jl+n)\bmod n 位,此时我们再使用第一段的方法更新 sumsumaia_i 即可,代码总时间复杂度 O(q)O(q)

    代码

    有个坑点,就是 sumsum 一定要开长整型(因为极端数据可能开到 105×10910^5\times 10^9)。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int q,n,a[100005],sum,op,x,y,jl=0;
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i];
    	cin>>q;
    	while(q--){
    		cin>>op>>x;
    		if(op==1){
    			cin>>y;
    			int wz=x-jl;
    			if(wz<=0)wz+=n;
    			sum=sum-a[wz]+y;
    			a[wz]=y;
    		}
    		else{
    			jl+=x;
    			jl%=n;
    		}
    		cout<<sum<<endl;
    	}
    	return 0;
    } 
    

    点个赞吧。

    • 1

    信息

    ID
    10292
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者