CF1834F 题解
dAniel_lele · · 题解
先考虑单词询问怎么做。对于每一个
观察到本质不同的询问只有
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[500005],b[500005],prea[500005],preb[500005];
signed main(){
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
reverse(b+1,b+n+1);
for(int i=1;i<=n;i++){
if(a[i]<i){
prea[0]++,prea[i-a[i]]--;
prea[i]++;
}
else{
prea[i]++,prea[i+n-a[i]]--;
}
if(b[i]<i){
preb[0]++,preb[i-b[i]]--;
preb[i]++;
}
else{
preb[i]++,preb[i+n-b[i]]--;
}
}
for(int i=1;i<=n;i++) prea[i]+=prea[i-1],preb[i]+=preb[i-1];
// for(int i=0;i<n;i++) cout<<prea[i]<<" "; cout<<"\n";
// for(int i=0;i<n;i++) cout<<preb[i]<<" "; cout<<"\n";
cout<<prea[0]<<"\n";
int q; cin>>q;
int sta=0,posa=0,posb=0;
while(q--){
int opt; cin>>opt;
if(opt==1){
int num;
cin>>num;
if(sta==0){
(posa+=num)%=n;
(posb+=n-num%n)%=n;
}
else{
(posa+=n-num%n)%=n;
(posb+=num)%=n;
}
}
if(opt==2){
int num;
cin>>num;
if(sta==0){
(posa+=n-num%n)%=n;
(posb+=num)%=n;
}
else{
(posa+=num)%=n;
(posb+=n-num%n)%=n;
}
}
if(opt==3){
sta^=1;
}
if(sta==0) cout<<prea[posa];
else cout<<preb[posb];
cout<<"\n";
}
return 0;
}