救命救命救命 CF455D
  • 板块灌水区
  • 楼主RE_Automation
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/4/18 18:14
  • 上次更新2023/11/5 00:22:41
查看原帖
救命救命救命 CF455D
90489
RE_Automation楼主2021/4/18 18:14
#include<bits/stdc++.h>

using namespace std;

const int N=1e5+20;
const int S=500;

int n;
deque<int>G[S];
int cnt[S][N];
int dis[N];
int b[N];
int sq;
long long ans;

int main()
{
	cin>>n;
	sq=sqrt(n);
	for(int i=1;i<=n;++i)
	{
		cin>>dis[i];
		b[i]=(i-1)/sq+1;
		cnt[b[i]][dis[i]]++;
		G[b[i]].push_back(dis[i]);
	}
//	for(int i=1;i<=n;++i)cout<<b[i]<<endl;
	int q;
	cin>>q;
	while(q--)
	{
		int T;
		cin>>T;
		int L,R;
		if(T==1)
		{
			int l,r;
			cin>>l>>r;
		
			l=((l+ans-1)%n)+1;
			r=((r+ans-1)%n)+1;
			if(l>r)swap(l,r);
			int L,R;
			L=l-(b[l]-1)*sq-1;
			R=r-(b[r]-1)*sq-1;
			if(b[l]==b[r])
			{
				int t=G[b[l]][R];
				for(int i=R;i>L;--i)G[b[l]][i]=G[b[l]][i-1];
				G[b[l]][L]=t;
				continue;
			}
			//cout<<l<<" "<<r<<" "<<L<<" "<<R<<endl;
			int last=G[b[l]].back();
			cnt[b[l]][last]--;
			cnt[b[l]][G[b[r]][R]]++;
			cnt[b[r]][last]--;
			for(int i=b[l]+1;i<b[r];++i)
			{
				cnt[i][last]++;
				G[i].push_front(last);
				last=G[i].back();
				G[i].pop_back();
				cnt[i][last]--;
			}
			int rev=G[b[r]][R];
			for(int i=G[b[l]].size()-1;i>L;--i)G[b[l]][i]=G[b[l]][i-1];
			G[b[l]][L]=rev;
			//cout<<"!!!!"<<endl;
			for(int i=R;i>0;--i)G[b[r]][i]=G[b[r]][i-1];
			G[b[r]][0]=last;
			cnt[b[r]][last]++;
		}
		else
		{
			int l,r,k;
			cin>>l>>r>>k;
			l=((l+ans-1)%n)+1;
			r=((r+ans-1)%n)+1;
			if(l>r)swap(l,r);
			k=((k+ans-1)%n)+1;
			ans=0;
			for(int i=b[l]+1;i<b[r];++i)
			{
				ans+=cnt[i][k];
			}
			L=l-(b[l]-1)*sq-1;
			R=r-(b[r]-1)*sq-1;
			if(b[l]!=b[r])
			{
				for(int i=L;i<G[b[l]].size();++i)ans+=(G[b[l]][i]==k);
				for(int i=0;i<=R;++i)ans+=(G[b[r]][i]==k);
			}
			else
			{
				for(int i=L;i<=R;++i)ans+=(G[b[l]][i]==k);
			}
			cout<<ans<<endl;
		}
	}
}
2021/4/18 18:14
加载中...