萌新刚学OI,0pts有WA有TLE
查看原帖
萌新刚学OI,0pts有WA有TLE
735763
_ChongYun_楼主2024/6/27 17:25

rt,还有数据能不能加强啊,同学暴力都能AC。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,l,r,T,len;
int HAM_qwq[1111][1111];
int a[50005],b[50005],cnt[50005],ans=0;
int pos[50005],L[50005],R[50005];
vector<int> qwq[50005];
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){ 
		if(ch=='-') f=-1;
		ch=getchar();
	}
    while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
    return x*f;
}
int logg(int x){
	if(x==1) return 0;
	int qq=1;
	for(int i=1;i<=20;i++){
		qq*=2;
		if(qq>x) return i-1;
	}
	return 1;
}
void init(int x){
	int maxx=0,qans=0;
	memset(cnt,0,sizeof(cnt));
	for(int i=L[x];i<=n;i++){
		cnt[a[i]]++;
		if(cnt[a[i]]>maxx||(cnt[a[i]]==maxx&&b[a[i]]<b[qans])){
			qans=a[i];
			maxx=cnt[a[i]];
		}
		HAM_qwq[x][pos[i]]=qans;
	}
	return ;
}
int qwq_(int x,int ll,int rr){
	int l=0,r=qwq[x].size()-1,qans=0,mid;
	while(l<=r){
		mid=(l+r)>>1;
		if(qwq[x][mid]>=ll){
			qans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	return qans;
}
int qaq_(int x,int ll,int rr){
	int l=0,r=qwq[x].size()-1,qans=0,mid;
	while(l<=r){
		mid=(l+r)>>1;
		if(qwq[x][mid]<=rr){
			qans=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	return qans;
}
int query(int l,int r){
	int maxx=0,qans=0;
	int p=pos[l],q=pos[r];
	if(p+1>=q-1){
		for(int i=l;i<=r;i++){
			int ql=qwq_(a[i],l,r);
			int qr=qaq_(a[i],l,r);
			if(qr-ql+1>maxx||(qr-ql+1==maxx&&b[a[i]]<b[qans])){
				qans=a[i];
				maxx=qr-ql+1;
			}
		}
		return b[qans];
	}
	qans=HAM_qwq[p+1][q-1];
	maxx=qaq_(qans,p+1,q-1)-qwq_(qans,p+1,q-1)+1;
	for(int i=l;i<=R[p];i++){
		int ql=qwq_(a[i],l,r);
		int qr=qaq_(a[i],l,r);
		if(qr-ql+1>maxx||(qr-ql+1==maxx&&b[a[i]]<b[qans])){
			qans=a[i];
			maxx=qr-ql+1;
		}
	}
	for(int i=L[q];i<=r;i++){
		int ql=qwq_(a[i],l,r);
		int qr=qaq_(a[i],l,r);
		if(qr-ql+1>maxx||(qr-ql+1==maxx&&b[a[i]]<b[qans])){
			qans=a[i];
			maxx=qr-ql+1;
		}
	}
	return b[qans];
}
signed main(){
	n=read(); q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=n;i++) b[i]=a[i];	
	T=sqrt(n*logg(n)); len=n/T;
	for(int i=1;i<=T;i++) L[i]=(i-1)*len+1;
	for(int i=1;i<=T;i++) R[i]=i*len;
	if(R[T]<n){ ++T; L[T]=R[T-1]+1; R[T]=n; }
	for(int i=1;i<=n;i++) pos[i]=(i-1)/len+1;
	sort(b+1,b+n+1);
	int o=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+o+1,a[i])-b;
	for(int i=1;i<=n;i++) qwq[a[i]].push_back(i);
	for(int i=1;i<=T;i++) init(i);
	while(q--){
		int l0,r0;
		l0=read(); r0=read();
		l=(l0+ans-1)%n+1; 
		r=(r0+ans-1)%n+1;
		if(l>r) swap(l,r);
		ans=query(l,r);
		printf("%lld\n",ans);
	}
	return 0;
}
2024/6/27 17:25
加载中...