珂爱分块求条
查看原帖
珂爱分块求条
494598
him的自我修养楼主2024/12/21 15:21

rt,P4168 区间众数,夹杂着 RE 与 WA

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=2e3;
int n,q,a[N],b[N],c,pos[N],f[M][M],s[M][N],t[N],cnt;
struct node{
	int l,r,len;
} k[M];
vector<int> v;
int query(int l,int r){
	v.clear();
	if(pos[r]-pos[l]>1){
		v.push_back(f[pos[l]+1][pos[r]-1]);
	}
	for(int i=l;i<=min(k[pos[l]].r,r);i++){
		v.push_back(a[i]);
		t[a[i]]++;
	}
	if(pos[l]!=pos[r]){
		for(int i=k[pos[r]].l;i<=r;i++){
			v.push_back(a[i]);
			t[a[i]]++;
		}
	}
	int mx=0,ans=2e9;
	for(int val:v){
		int cc=(s[pos[r]-1][val]-s[pos[l]][val])*(pos[l]!=pos[r])+t[val];
		if(mx<=cc){
			if(mx==cc){
				ans=min(ans,val);
			}else{
				ans=val;
			}
			mx=cc;
		}
		t[val]=0;
	}
	return ans;
}
int main(){
	cin >>n>>q;
	for(int i=1;i<=n;i++){
		cin >>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	int l=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+l+1,a[i])-b;
	}
	while(c*c*c<=n*n){
		c++; 
	}
	c--;
	c=max(1,c);
	int p=0;
	for(int i=1;i<=n/c;i++){
		cnt++;
		k[cnt].l=p+1;
		for(int j=1;j<=c;j++){
			p++;
			pos[p]=cnt;
		}
		k[cnt].r=p;
		k[cnt].len=k[cnt].r-k[cnt].l+1;
	}
	if(p!=n){
		cnt++;
		k[cnt].l=p+1;
		k[cnt].r=n;
		k[cnt].len=k[cnt].r-k[cnt].l+1;
	}
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=l;j++){
			s[i][j]=s[i-1][j];
		}
		for(int j=k[i].l;j<=k[i].r;j++){
			s[i][a[j]]++;
		}
	}
	for(int i=1;i<=cnt;i++){
		for(int j=i;j<=cnt;j++){
			int mx=0;
			f[i][j]=max(f[i][j],f[i][j-1]); 
			for(int k=1;k<=l;k++){
				if(mx<s[j][k]-s[i-1][k]){
					mx=s[j][k]-s[i-1][k];
					f[i][j]=k;
				}
			}
		}
	}
	int x=0;
	while(q--){
		int l,r;
		cin >>l>>r;
		l=(l+x-1)%n+1;
		r=(r+x-1)%n+1;
		if(l>r){
			swap(l,r);
		} 
		x=query(l,r);
		cout <<b[x]<<endl;
	}
	return 0;
}
2024/12/21 15:21
加载中...