全RE求助
查看原帖
全RE求助
999274
CNS_5t0_0r2楼主2023/11/13 20:10
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 9,SqrtN = 710;
int n,m,ans;
int a[N],tmp[N],len;
int block_cnt,block_len;
struct block{
	int start,end;
} b[SqrtN];
int belong[N];
int p[SqrtN][SqrtN];
vector<int> id[N];
int at[N];
void build(){
	block_cnt = block_len = (int)sqrt(n);
    for (int i = 1;i <= block_cnt;i++) {
        b[i].start = b[i - 1].end + 1;
        b[i].end = block_len * i;
    }
    b[block_cnt].end = n;
    for (int i = 1;i <= block_cnt;i++)
        for (int j = b[i].start;j <= b[i].end;j++)
           belong[j] = i;
}
int cnt[N];
void init(){
	for(int i = 1;i <= block_cnt;i++){
	    int Max_cnt = 0;
		memset(cnt,0,sizeof cnt);
		for(int j = i;j <= block_cnt;j++){
			for(int k = b[j].start;k <= b[j].end;k++)
				Max_cnt = max(Max_cnt,++cnt[a[k]]);
			p[i][j] = Max_cnt;
		}
	}	
}
int query(int l,int r){
	int pos_l = belong[l],pos_r = belong[r];
	memset(cnt,0,sizeof cnt);
	int ret = p[pos_l + 1][pos_r - 1];
	if(pos_l == pos_r){
		ret = 0;
		for(int i = l;i <= r;i++)
			ret = max(ret,++cnt[a[i]]);
		return ret;
	}
	for(int i = l;i <= b[pos_l].end;i++)
		for(;at[i] + ret < id[a[i]].size() && id[a[i]][at[i] - ret] <= r;ret++)
	for(int i = b[pos_r].start;i <= r;i++)
		for(;at[i] - ret >= 0 && id[a[i]][at[i] - ret] >= l;ret++)
	return ret;
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= n;i++){
		scanf("%d", &a[i]);
		tmp[i] = a[i];
	}
	sort(tmp + 1,tmp + n + 1);
	len = unique(tmp + 1,tmp + n + 1) - tmp - 1;
	for(int i = 1;i <= n;i++){
		a[i] = lower_bound(tmp + 1,tmp + len + 1,a[i]) - tmp;
		id[a[i]].push_back(i);
		at[i] = id[a[i]].size() - 1;
	}
	build();
	init();
	for(int i = 1;i <= m;i++){
		int l,r;
		scanf("%d%d", &l, &r);
		l ^= ans;
		r ^= ans;
		if(l > r)
			swap(l,r);
		ans = query(l,r);
		printf("%d\n",ans);
	}
}
2023/11/13 20:10
加载中...