为什么在本地和洛谷IDE上都过了,可CF上面连第一个点都过不去
查看原帖
为什么在本地和洛谷IDE上都过了,可CF上面连第一个点都过不去
707513
LBYYSM_123楼主2023/9/19 22:45

RT

// LUOGU_RID: 125254708
#include<bits/stdc++.h>
using namespace std;
int n,q,m;
int a[100001];
int bel[100001];
int st[317],ed[317];
deque<int> ge[317];
int cnt[317][100001];
int last;
void modify(int l,int r){
	if(bel[l]==bel[r]){
		int tmp=ge[bel[l]][r-st[bel[l]]];
		for(int i=r;i>l;i--)
			ge[bel[l]][i-st[bel[l]]]=ge[bel[l]][i-1-st[bel[l]]];
		ge[bel[l]][l-st[bel[l]]]=tmp;
	}
	else{
		for(int i=bel[l]+1;i<=bel[r];i++){
			int tmp=ge[i-1].back();
			ge[i].push_front(tmp);
			cnt[i][tmp]++;
			ge[i-1].pop_back();
			cnt[i-1][tmp]++;
		}
		ge[bel[l]].insert(ge[bel[l]].begin()+(l-st[bel[l]]),ge[bel[r]][r-st[bel[r]]+1]);
  		++cnt[bel[l]][ge[bel[r]][r-st[bel[r]+1]]];
  		--cnt[bel[r]][ge[bel[r]][r-st[bel[r]+1]]];
  		ge[bel[r]].erase(ge[bel[r]].begin()+(r-st[bel[r]+1]));
	}
}
void ask(int l,int r,int k){
	int ans=0;
	if(bel[l]==bel[r]){
		for(int i=l;i<=r;i++)
			if(ge[bel[l]][i-st[bel[l]]]==k)
				ans++;	
	}
	else{
		for(int i=l;i<=ed[bel[l]];i++)
			if(ge[bel[l]][i-st[bel[l]]]==k)
				ans++;	
		for(int i=st[bel[r]];i<=r;i++)
			if(ge[bel[r]][i-st[bel[r]]]==k)
				ans++;	
		for(int i=bel[l]+1;i<bel[r];i++)
			ans+=cnt[i][k];
	}
	cout<<ans<<'\n';
	last=ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;q=sqrt(n);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=q;i++)
		st[i]=n/q*(i-1)+1,ed[i]=n/q*i;ed[q]=n;
	for(int i=1;i<=q;i++)
		for(int j=st[i];j<=ed[i];j++)
			ge[i].push_back(a[j]),
			bel[j]=i,
			cnt[i][a[j]]++;
	cin>>m;
	for(int i=1;i<=m;i++){
		int id,l,r;
		cin>>id>>l>>r;
		l=(l+last-1)%n+1;
		r=(r+last-1)%n+1;
		if(l>r) swap(l,r); 
		if(id==1){
			modify(l,r);
		}
		else{
			int k;
			cin>>k;
			k=(k+last-1)%n+1;
			ask(l,r,k);
		}
	}
	return 0;
} 
2023/9/19 22:45
加载中...