分块全 WA 求 Hack
查看原帖
分块全 WA 求 Hack
534296
aCssen楼主2023/7/19 15:26
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=4e4+5;
const int maxm=205;
int a[maxn],raw[maxn],pos[maxn],posl[maxm],posr[maxm],Cnt[maxn],cnt[maxm][maxn],ans[maxm][maxn],n,m,p,lastans;
vector<int>v[maxn];
int binary_search(int ver,int Pos){
	int l=1,r=v[ver].size()+1;
	while(l<r){
		int mid=l+r>>1;
		if(v[ver][mid-1]>Pos) r=mid;
		else l=mid+1; 
	}
	return l-1;
}
void prework(){
	sort(raw+1,raw+n+1);
	int len=unique(raw+1,raw+n+1)-raw-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(raw+1,raw+len+1,a[i])-raw;
		v[a[i]].push_back(i);
	}
	pos[n+1]=pos[n]+1;
	for(int i=1;i<=n+1;i++){
		if(pos[i]!=pos[i-1]){
			posl[pos[i]]=i;
			posr[pos[i-1]]=i-1;
		}
	}
	for(int i=1;i<=pos[n];i++){
		int L=posl[i];
		for(int j=L;j<=n;j++){
			Cnt[a[j]]++;
			if(Cnt[a[j]]>Cnt[ans[i][j]])
				ans[i][j]=j;
			if(Cnt[a[j]]==Cnt[ans[i][j]]&&a[j]<a[ans[i][j]])
				ans[i][j]=j;
			cnt[i][j]=Cnt[ans[i][j]];
		}
		for(int j=L;j<=n;j++) Cnt[a[j]]--;
	}
}
int query(int l,int r){
	int val=0,value=0;
	for(int i=l;i<=min(r,posr[pos[l]]);i++){
		int R=binary_search(a[i],r);
		int L=lower_bound(v[a[i]].begin(),v[a[i]].end(),l)-v[a[i]].begin()+1;
		int t=R-L+1;
		if(t>value){
			value=t;
			val=a[i];
		}
		if(t==value&&a[i]<val) val=a[i];
	}
	if(pos[l]==pos[r]) return raw[val];
	for(int i=posl[pos[r]];i<=r;i++){
		int R=binary_search(a[i],r);
		int L=lower_bound(v[a[i]].begin(),v[a[i]].end(),l)-v[a[i]].begin()+1;
		int t=R-L+1;
		if(t>value){
			value=t;
			val=a[i];
		}
		if(t==value&&a[i]<val) val=a[i];
	}
	if(cnt[pos[l]+1][posr[pos[r]-1]]>value){
		value=cnt[pos[l]+1][posr[pos[r]-1]];
		val=a[ans[pos[l]+1][posr[pos[r]-1]]];
	}
	if(cnt[pos[l]+1][posr[pos[r]-1]]==value&&a[ans[pos[l]+1][posr[pos[r]-1]]]<val)
		val=a[ans[pos[l]+1][posr[pos[r]-1]]];
	return raw[val];
}
int main(){
	scanf("%d%d",&n,&m);
	p=max((int)sqrt(n),1);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		raw[i]=a[i];
		pos[i]=(i-1)/p+1;
	}
	prework();
	while(m--){
		int l,r;
		scanf("%d%d",&l,&r);
		l=(l+lastans-1)%n+1,r=(r+lastans-1)%n+1;
		if(l>r) swap(l,r);
		lastans=query(l,r);
		printf("%d\n",lastans);
	}
	return 0;
}
2023/7/19 15:26
加载中...