分块,RE on test 9求助
查看原帖
分块,RE on test 9求助
203623
critnos楼主2021/2/4 20:47
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int l[100005],r[100005];
int bl[100005];
deque<int> p[320];
int h[320][100005];
int n,b,cnt;
void init()
{
	int i,j;
	b=sqrt(n);
	//b=n;
	for(i=1;i<=n;i+=b)
		l[++cnt]=i,r[cnt]=min(n,i+b-1);
	for(i=1;i<=cnt;i++)
	{
		for(j=l[i];j<=r[i];j++)
		{
			bl[j]=i;
			p[i].push_back(a[j]);
			h[i][a[j]]++;
		}
	}		
}
int _(int w)
{
	return p[bl[w]][w-l[bl[w]]];
}
void insert(int w,int u)
{
	h[bl[w]][u]++;
	p[bl[w]].insert(p[bl[w]].begin()+w-l[bl[w]],u);
}
void erase(int w)
{
	h[bl[w]][_(w)]--;
	p[bl[w]].erase(p[bl[w]].begin()+w-l[bl[w]]);
}
void add(int l,int r)
{
	int s,i,fl=bl[l],fr=bl[r];
	if(fl==fr)
	{
		s=_(r);
		erase(r);
		insert(l,s);
		return;
	}
	s=_(r);
	erase(r);
	for(i=fr-1;i>=fl;i--)
	{
		h[i+1][p[i].back()]++;
		h[i][p[i].back()]--;
		p[i+1].push_front(p[i].back());
		p[i].pop_back();
	}
	insert(l,s);
}
int ask(int pl,int pr,int k)
{
	int s=0,i,fl=bl[pl],fr=bl[pr];
	if(fl==fr)
	{
		for(i=pl;i<=pr;i++)
			s+=_(i)==k;
		return s;
	}
	for(i=fl+1;i<fr;i++)
		s+=h[i][k];
	return s+ask(pl,r[fl],k)+ask(l[fr],pr,k);
}
int main()
{
	int m,i,opt,l,r,k,last=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	init();
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d%d%d",&opt,&l,&r);
		l=(l+last-1)%n+1,r=(r+last-1)%n+1;
		if(l>r) swap(l,r);
		if(opt==1) add(l,r);
		else scanf("%d",&k),k=(k+last-1)%n+1,printf("%d\n",last=ask(l,r,k));
//		for(i=1;i<=cnt;i++)
//			for(int j=0;j<p[i].size();j++)
//				cout<<p[i][j]<<' ';
//		cout<<endl;
	}
} 
2021/2/4 20:47
加载中...