玄关求条//woshinailong
查看原帖
玄关求条//woshinailong
1234924
lsd110504lsd楼主2025/8/5 16:00

rtqwq

你在那个城市里面过得好吗?


#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
int n,m;
const int N=40000+520;
const int block_size=(int)sqrt(N)+5;
int tag[N],cl[N],cr[N],f[block_size][block_size],sum[block_size][N],cn[block_size][N];
int a[N];
int x;
vector<int> val;
unordered_map<int,int> mp_rnk;
inline void build(){
	int B=sqrt(n);
	sort(val.begin(),val.end());
	val.erase(unique(val.begin(),val.end()),val.end());
	int cnt=0;
	for(auto v:val){
		mp_rnk[v]=cnt++;
	}
	for(int i=1;i<=(n%B==0?n/B:n/B+1);i++){
		for(int j=(i-1)*B+1;j<=min(n,i*B);j++){
			tag[j]=i;
			cl[j]=(i-1)*B+1;
			cr[j]=min(n,i*B);
			cn[i][mp_rnk[a[j]]]++;
		}
		for(auto v:val)		sum[i][mp_rnk[v]]=sum[i-1][mp_rnk[v]]+cn[i][mp_rnk[v]];
	}
	for(int i=1;i<=B;i++){
		for(int j=i;j<=B;j++){
			int zs=f[i][j-1];
			for(int k=(j-1)*B+1;k<=min(j*B,n);k++){
				if(/*sum[j][mp_rnk[a[k]]]-sum[i-1][mp_rnk[a[k]]]>=2&&*/sum[j][mp_rnk[a[k]]]-sum[i-1][mp_rnk[a[k]]]>=sum[j][mp_rnk[zs]]-sum[i-1][mp_rnk[zs]]){
					if(sum[j][mp_rnk[a[k]]]-sum[i-1][mp_rnk[a[k]]]>=sum[j][mp_rnk[zs]]-sum[i-1][mp_rnk[zs]])	zs=min(zs,a[k]);
					else zs=a[k];
				}
			}
			f[i][j]=zs;
		}
	}
}
unordered_map<int,int> tmp;
inline int query(int l,int r){
	int ans=0,res=0;
	if(tag[r]-tag[l]<=1){
		for(int i=l;i<=r;i++){
			if(++tmp[a[i]]>ans){
				ans=tmp[a[i]];
				res=a[i];
			}
			else if(tmp[a[i]]==ans){
				res=min(res,a[i]);
			}
		}
		tmp.clear();
		return res;
	}
	else{
		res=f[tag[l]+1][tag[r]-1];
		for(int i=l;i<=cr[l];i++){
			tmp[a[i]]++;
		}
		for(int i=cl[r];i<=r;i++){
			tmp[a[i]]++;
		}
		ans=sum[tag[r]-1][mp_rnk[f[tag[l]+1][tag[r]-1]]]-sum[tag[l]][mp_rnk[f[tag[l]+1][tag[r]-1]]];
		for(auto v:val){
			if(tmp[v]){
				if(sum[tag[r]-1][mp_rnk[v]]-sum[tag[l]][mp_rnk[v]]+tmp[v]==ans){
					res=min(res,v);
				}
				else if(sum[tag[r]-1][mp_rnk[v]]-sum[tag[l]][mp_rnk[v]]+tmp[v]>ans){
					ans=sum[tag[r]-1][mp_rnk[v]]-sum[tag[l]][mp_rnk[v]]+tmp[v];
					res=v;
				}
			}
		}
		tmp.clear();
		return res;
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);
	cin>>n>>m;
	for(int i=1;i<=n;i++)	cin>>a[i],val.push_back(a[i]);
	build();
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>l>>r;
		l=(l+x-1)%n;
		l++;
		r=(r+x-1)%n;
		r++;
		if(l>r)	swap(l,r);
		cout<<query(l,r)<<endl;
	}
	return 0;
}
2025/8/5 16:00
加载中...