1 条题解
-
0
思路
这种题也是老生常谈,我们可以用一个变量 来记录 的值,每次操作 就用 减去 加上 就可以 正确更新 ,注意此时 的值也要更新为 ,因为还有后续操作。
再考虑操作 ,如何也 完成并能和操作 配合呢?于是我们就可以设一个变量 来记录向右移动的位数,移动超过了 位就相当于移动了 位。
再反观操作 ,这时我们就可以这样想,现在让你修改的是向右移动 位后的 位,其实就是原先的 位,此时我们再使用第一段的方法更新 和 即可,代码总时间复杂度 。
代码
有个坑点,就是 一定要开长整型(因为极端数据可能开到 )。
#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
- 上传者