提供hack数据
查看原帖
提供hack数据
184084
_Freedom_楼主2021/2/2 15:52

rt,谷上的数据中太多重复的数字了,导致离散化后的 n^2暴力能过,建议加上一组序列中无重复数字的测试点。

(以下是我之前以为的正解,今天在另一个oj上被卡了)

# include <iostream>
# include <cstdio>
# include <cmath>
# include <algorithm>
using namespace std;

void read(int &x) {
	static char c=getchar();
	int f=1;
	x=0;
	while(!isdigit(c)) {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c)) {
		x=x*10+(c^'0');
		c=getchar();
	}
	x*=f;
}

const int N=40010,K=210;

int L[K],R[K],pos[N];
int s[K][N];//s[i][j]?°i?é?DóD????j
int cnt[N];

int a[N];

int p[N],tot;

int x;

void print() {
	int maxx=0;
	for(int i=1; i<=tot; i++) {
		if(cnt[i]>maxx) {
			maxx=cnt[i];
			x=i;
		}
	}
	printf("%d\n",p[x]);
}

int main() {

//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);

	int n,m,t,i,j,k,l,r;

	read(n),read(m);

	t=sqrt(n);

	for(i=1; i<=n; i++) {
		read(a[i]);
		p[i]=a[i];
	}

	sort(p+1,p+1+n);
	tot=unique(p+1,p+1+n)-p-1;

	for(i=1; i<=n; i++) a[i]=lower_bound(p+1,p+1+tot,a[i])-p;

	for(i=1; i<=t; i++) {
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}

	if(R[t]<n) {
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}

	for(i=1; i<=t; i++) {
		for(j=L[i]; j<=R[i]; j++) {
			pos[j]=i;
		}
	}

	for(i=1; i<=t; i++) {
		for(j=1; j<=tot; j++) s[i][j]=s[i-1][j];
		for(j=L[i]; j<=R[i]; j++) s[i][a[j]]++;
	}

	while(m--) {
		read(l),read(r);
		l=(l+p[x]-1)%n+1;
		r=(r+p[x]-1)%n+1;
		if(l>r) swap(l,r);
		if(pos[l]==pos[r]) {
			for(i=1; i<=tot; i++) cnt[i]=0;
			for(i=l; i<=r; i++) cnt[a[i]]++;
			print();
		} else {
			//pos[l]+1~pos[r]-1
			for(i=1; i<=tot; i++) cnt[i]=s[pos[r]-1][i]-s[pos[l]][i];
			for(i=l; i<=R[pos[l]]; i++) cnt[a[i]]++;
			for(i=L[pos[r]]; i<=r; i++) cnt[a[i]]++;
			print();
		}
	}

//	fclose(stdin);
//	fclose(stdout);

	return 0;
}
2021/2/2 15:52
加载中...