为何被卡空间?
查看原帖
为何被卡空间?
999274
CNS_5t0_0r2楼主2023/11/13 19:35
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 9,SqrtN = 710;
int n,m,ans;
int a[N];
int block_cnt,block_len;
//struct block{
//	int start,end,size;
//} b[SqrtN];
//int belong[N];
int p[SqrtN][SqrtN];
int s[SqrtN][N];
void build(){
	block_cnt = (int)sqrt(n);
//	block_len = (n + block_cnt - 1) / block_cnt;
//    for (int i = 1;i <= block_cnt;i++) {
//        b[i].start = n / block_cnt * (i - 1) + 1;
//        b[i].end = n / block_cnt * 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;
//        b[i].size = b[i].end - b[i].start + 1;
//    }
}
int belong(int id){
	return id / block_cnt + 1;
}
int start(int id){
	return n / block_cnt * (id - 1) + 1;
}
int end(int id){
	return n / block_cnt * id;
}
int cnt[N];
void init(){
	for(int i = 1;i <= block_cnt;i++){
		for(int j = 1;j <= n;j++)
			s[i][j] = s[i - 1][j];
		for(int j = start(i);j <= end(i);j++)
			s[i][a[j]]++;
	}
	for(int i = 1;i <= block_cnt;i++){
	    int Max = INT_MAX,Max_cnt = 0;
		memset(cnt,0,sizeof cnt);
		for(int j = i;j <= block_cnt;j++){
			for(int k = start(j);k <= end(j);k++){
				cnt[a[k]]++;
				if(cnt[a[k]] > Max_cnt || (cnt[a[k]] == Max_cnt && a[k] < Max)){
					Max = a[k];
					Max_cnt = cnt[a[k]];
				}
			}
			p[i][j] = Max;
		}
	}
}
int query(int l,int r){
	int pos_l = belong(l),pos_r = belong(r);
	int Max = INT_MAX,Max_cnt = 0;
	memset(cnt,0,sizeof cnt);
	int ret = p[pos_l + 1][pos_r - 1],ret_cnt = s[pos_r - 1][ret] - s[pos_l][ret];
	if(pos_l == pos_r){
		for(int i = l;i <= r;i++){
			cnt[a[i]]++;
			if(cnt[a[i]] > Max_cnt || (cnt[a[i]] == Max_cnt && a[i] < Max)){
				Max = a[i];
				Max_cnt = cnt[a[i]];
			}
		}
		return Max;
	}
	for(int i = l;i <= end(pos_l);i++)
		cnt[a[i]]++;
	for(int i = start(pos_r);i <= r;i++)
		cnt[a[i]]++;
	ret_cnt += cnt[ret];
	for(int i = l;i <= end(pos_l);i++){
		int val = cnt[a[i]] + s[pos_r - 1][a[i]] - s[pos_l][a[i]];
		if(val > Max_cnt || (val == Max_cnt && a[i] < Max)){
			Max = a[i];
			Max_cnt = val;
		}
	}
	for(int i = start(pos_r);i <= r;i++){
		int val = cnt[a[i]] + s[pos_r - 1][a[i]] - s[pos_l][a[i]];
		if(val > Max_cnt || (val == Max_cnt && a[i] < Max)){
			Max = a[i];
			Max_cnt = val;
		}
	}
	if(Max_cnt > ret_cnt)
		ret = Max;
	return s[pos_r - 1][ret] - s[pos_l][ret] + cnt[ret];
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= n;i++)
		scanf("%d", &a[i]);
	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 19:35
加载中...