社区讨论

求调

P4168[Violet] 蒲公英参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjru9sq
此快照首次捕获于
2025/11/04 07:28
4 个月前
此快照最后确认于
2025/11/04 07:28
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn = 40000 + 10;
int n,m,dot = 0,_n,zu;
int b[maxn],cnt[maxn],s[1000][40000 + 10],p[1000][1000],tong[40000 + 10];
struct node {
	int x,id,pos;
}a[maxn];
bool compare (node a,node b) {
	return a.x < b.x;
}
bool cmp(node a,node b) {
	return a.pos < b.pos;
}
void build() {
	for (int i = 1; i <= zu; i++) {
		for (int j = (i - 1) * _n + 1; j <= (min(n,i * _n)); j++) {
			s[i][a[j].id]++;
		}
		for (int j = 1; j <= dot; j++) {
			s[i][j] += s[i - 1][j];
		} 
	}
	for (int i = 1; i <= zu; i++) {
		for (int j = i; j <= zu; j++) {
			int shu = p[i][j - 1];
			for (int k = (j - 1) * _n + 1; k <= min(n,j * _n); k++) {
				if(((s[j][a[k].id] - s[i - 1][a[k].id]) > (s[j][shu] - s[i - 1][shu]))|| ((s[j][a[k].id] - s[i - 1][a[k].id] == s[j][shu] - s[i - 1][shu]) && a[k].id < shu)) {
					shu = a[k].id;
				}
			}
			p[i][j] = shu;
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
    _n = (int)sqrt(n),zu = (n - 1) / _n + 1;
	for (int i = 1; i <= n; i++) {
		cin >> b[i];
		a[i].x = b[i];
		a[i].pos = i;
	}
	sort(a + 1,a + n + 1,compare);
	for (int i = 1; i <= n; i++) {
		if(i == 1) {
			a[i].id = ++dot;
		}
		else {
			if(a[i].x > a[i - 1].x) {
				a[i].id = ++dot;
			}
			else {
				a[i].id = dot;
			}
		}
    }
    sort(a + 1, a + n + 1,cmp);
//	for (int i = 1; i <= n; i++) {
//		cout << a[i].x << " " <<a[i].id << " " << a[i].pos << "\n";
//	}
	int last = 0;
	build();
	memset(tong,0,sizeof(tong));
	for (int i = 1; i <= m; i++) {
		int l,r,l0,r0,ans = -1,now;
		cin >> l0 >> r0;
		l = ((l0 + last - 1) % n) + 1;
		r = ((r0 + last - 1) % n) + 1;
//		cout << l << " " << r << " lr\n";
		if (l > r) swap(l,r);
		int blkl = (l - 1) / _n + 1,blkr = (r - 1) / _n + 1;
		if(blkr - blkl <= 1) {
			int mx = -1,now;
			for (int j = l; j <= r; j++) {
				tong[a[j].id]++;
				if((tong[a[j].id] > mx) || (tong[a[j].id] == mx && a[j].x <= now)) {
					mx = tong[a[j].id];
					now = a[j].x;
				}
			}
			last = now;
			for (int j = l; j <= r; j++) {
				tong[j] = 0;
			} 
		}
		else {
			int now = p[blkl + 1][blkr - 1];
			for (int j = l; j <= _n * blkl; j++) {
				tong[a[j].id]++;
			}
			for (int j = _n * (blkr - 1) + 1; j <= r; j++) {
				tong[a[j].id]++;
			}
			for (int j = l; j <= _n * blkl; j++) {
				int x1 = tong[a[j].id] + s[blkr - 1][a[j].id] - s[blkl][a[j].id];
				int x2 =  tong[now] + s[blkr - 1][now] - s[blkl][now];
				if(x1 > x2||(x1 == x2 && a[j].id < now)) {
					now = a[j].id;
					last = a[j].x;
				}
			}
			for (int j = _n * (blkr - 1) + 1; j <= r; j++) {
				int x1 = tong[a[j].id] + s[blkr - 1][a[j].id] - s[blkl][a[j].id];
				int x2 =  tong[now] + s[blkr - 1][now] - s[blkl][now];
				if (x1 > x2 || (x1 == x2 && a[j].id < now)) {
					now = a[j].id;
					last = a[j].x;
				}
			}
			for (int j = l; j <= _n * blkl; j++) {
				tong[a[j].id] = 0;
			}
			for (int j = _n * (blkr - 1) + 1; j <= r; j++) {
				tong[a[j].id] = 0;
			}
		} 
//		for (int i = 1; i <= dot; i++) {
//			cout << cnt[i] << " cnt\n";
//		}
		cout << last << "\n";
	}
	return 0;
} 
和暴力代码手动输了几个小数据都一样,但是 0 分(那个暴力代码是对的)

回复

0 条回复,欢迎继续交流。

正在加载回复...