刚学分块求调,样例过,WA 0 pts
查看原帖
刚学分块求调,样例过,WA 0 pts
571147
zhlzt楼主2024/7/23 19:19
#include<bits/stdc++.h>
using namespace std;
#define low lower_bound
const int maxn=4e4+10;
const int maxm=40;
int belong[maxn],uni[maxn];
int sta[maxm],fin[maxm];
int book[maxn],w[maxn];
int cnt[maxm][maxm][maxn],dp[maxm][maxm];
int query(int l,int r){
	int pl=belong[l],pr=belong[r];
	int ans=dp[pl+1][pr-1];
	int app=cnt[pl+1][pr-1][ans];
	if(pl==pr){
		for(int i=l;i<=r;i++){
			cnt[pl+1][pr-1][uni[i]]++;
			if(cnt[pl+1][pr-1][uni[i]]>app){
				ans=uni[i];
				app=cnt[pl+1][pr-1][uni[i]]+1;
			}
			else if(cnt[pl+1][pr-1][uni[i]]==app){
				if(uni[i]<ans) ans=uni[i];
			}
		}
		for(int i=l;i<=r;i++){
			cnt[pl+1][pr-1][uni[i]]--;
		}
	} else {
		for(int i=l;i<=fin[pl];i++){
			cnt[pl+1][pr-1][uni[i]]++;
			if(cnt[pl+1][pr-1][uni[i]]>app){
				ans=uni[i];
				app=cnt[pl+1][pr-1][uni[i]];
			}
			else if(cnt[pl+1][pr-1][uni[i]]==app){
				if(uni[i]<ans) ans=uni[i];
			}
		}
		for(int i=sta[pr];i<=r;i++){
			cnt[pl+1][pr-1][uni[i]]++;
			if(cnt[pl+1][pr-1][uni[i]]>app){
				ans=uni[i];
				app=cnt[pl+1][pr-1][uni[i]];
			}
			else if(cnt[pl+1][pr-1][uni[i]]==app){
				if(uni[i]<ans) ans=uni[i];
			}
		}
		for(int i=l;i<=fin[pl];i++){
			cnt[pl+1][pr-1][uni[i]]--;
		}
		for(int i=sta[pr];i<=r;i++){
			cnt[pl+1][pr-1][uni[i]]--;
		}
	}
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n;cin>>n; int m;cin>>m;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n;i++) book[i]=w[i];
	sort(book+1,book+1+n);
	int pos=unique(book+1,book+1+n)-book-1;
	for(int i=1;i<=n;i++){
		uni[i]=low(book+1,book+1+pos,w[i])-book;
	}
	int len=(int)pow(1.0*n,1.0/3*2);
	for(int i=1;i<=n;i++){
		belong[i]=(i+len-1)/len; 
	}
	int tot=belong[n];
	for(int i=1;i<=tot;i++){
		sta[i]=len*(i-1)+1; fin[i]=min(n,len*i);
	}
	for(int i=1;i<=tot;i++){
		for(int j=i;j<=tot;j++){
			for(int k=sta[i];k<=fin[j];k++){
				cnt[i][j][uni[k]]++;
			}
			for(int k=1;k<=pos;k++){
				int pre=dp[i][j];
				if(cnt[i][j][k]>cnt[i][j][pre]) dp[i][j]=k;
			}
		}
	}
	int last=0;
	for(int t=1;t<=m;t++){
		int l,r;cin>>l>>r;
		l=(l+last-1)%n+1; r=(r+last-1)%n+1;
		if(l>r) swap(l,r);
		last=book[query(l,r)];
		cout<<last<<'\n';
	}
	return 0;
}
2024/7/23 19:19
加载中...