按照蓝书O(N^(5/3))算法,被卡70分求助
查看原帖
按照蓝书O(N^(5/3))算法,被卡70分求助
126415
nodeee楼主2020/8/6 14:05

蒟蒻被卡70分,请教各位巨佬怎么样才能过QAQ

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[40005],li[40005];
int t;
int d[40][40][40005];
int len;
inline void init(){
	register int kk=n/t;
	for(int i=1;i<=n;i++){
		int pos=(i-1)/kk+1;
		d[pos][pos][a[i]]++;
	}
	for(register int i=1;i<=t;i++){
		for(register int j=i+1;j<=t;j++){
			for(register int k=1;k<=len;k++)d[i][j][k]=d[i][j-1][k]+d[j][j][k];
		}
	}
}
int ans=0,pos;
inline void query(int l,int r){
	register int k=n/t;//每一段的长度 
	register int ed=((l-1)/k+1)*k;//左边末尾 
	register int st=(r-1)/k*k+1;//右边开始
	if(st<ed)st=99999999,ed=r;//只有不到一段的情况
//	cout<<ed<<" "<<st<<endl;
	register int from=(l-1)/k+2,to=(r-1)/k;//首尾块编号
	for(register int i=l;i<=ed;i++){
		d[from][to][a[i]]++;
	}
	for(register int i=st;i<=r;i++){
		d[from][to][a[i]]++;
	}
	for(register int i=1;i<=n;i++){
		if(ans<d[from][to][i]){
			ans=d[from][to][i],pos=i;
		}
	}
	printf("%d\n",li[pos]);
	for(register int i=l;i<=ed;i++){
		d[from][to][a[i]]--;
	}
	for(register int i=st;i<=r;i++){
		d[from][to][a[i]]--;
	} 
}
void lisan(){
	sort(li+1,li+1+n);
	len=unique(li+1,li+1+n)-li-1;
	for(register int i=1;i<=n;i++){
		a[i]=lower_bound(li+1,li+len+1,a[i])-li;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		li[i]=a[i];
	}
	lisan();//离散化
	t=pow(n,1.0/3);//T按照蓝书上取N^(1/3)
	init();
	register int l,r;
	for(register int i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		l=(l+li[pos]-1)%n+1,r=(r+li[pos]-1)%n+1;
		if(l>r)swap(l,r);
		ans=0;
		query(l,r);
	}
	return 0;
}
2020/8/6 14:05
加载中...