P4168 [Violet]蒲公英 玄学Bug
  • 板块题目总版
  • 楼主Crane_w
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/21 13:53
  • 上次更新2023/10/23 20:57:21
查看原帖
P4168 [Violet]蒲公英 玄学Bug
525216
Crane_w楼主2023/3/21 13:53

本地跑测试数据1是对的,就上去就莫名错了, 但提交显示没有re(开O2也是)就遇到这种情况的可能原因! 代码详情如下

#include <bits/stdc++.h>
#define for_(i,a,b) for (int i = (a); i < (b); i++)
#define rep_(i,a,b) for (int i = (a); i <= (b); i++)
#define per_(i,a,b) for (int i = (a); i >= (b); i--)
#define ll long long
#define pii pair<int, int>
#define fi first
#define se second
#define sz(a) (int)a.size()
#define all(v) v.begin(), v.end()
#define int long long
#define ull unsigned long long
#define pb push_back
#define CE cout << endl;
#define CO cout << "OK" << endl;
#define D DEBUG
#define DEBUG(x) cerr << #x << '=' << x << endl
#define endl '\n'
//#define _Pos(i, j) (((i)-1)*cnt+(j))
using namespace std;
const int maxn = 5e5 + 10, mod = 1e9 + 7;// mod = 1949777;
const double EPS = 1e-3;
int n, m, t;
int a[maxn], id[maxn], l[maxn], r[maxn];
int b[maxn];
int cnt, s[maxn];
int _Pos(int i, int j) {
	return (i - 1) * cnt + j;
} 
void solve() {
}
signed main() {
//	#ifdef LOCAL
//		freopen("w.in", "r", stdin);
//		freopen("w.ans", "w", stdout);
//	#endif
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	//int tt; cin >> tt; while(tt--) solve();
	cin >> n >> m;
//
	while(t * t * t < n) t++; t--; // 
	t = n / t; //the lenth of a bar
//	
	rep_(i, 1, n) {
		cin >> a[i]; b[i] = a[i];
	} 
	sort(b + 1, b + 1 + n); int len = unique(b + 1, b + 1 + n) - b - 1;
	rep_(i, 1, n) {
		a[i] = lower_bound(b + 1, b + 1 + len, a[i]) - b;
		assert(1 <= a[i] && a[i] <= n);
	}
//
	for (int i = 1; i <= n / t; i++) {
		l[i] = (i - 1) * t + 1;
		r[i] = i * t;
	}
	cnt = n / t;
	if (r[cnt] < n) l[++cnt] = r[cnt - 1] + 1, r[cnt] = n;
	for (int i = 1; i <= cnt; i++) {
		for (int j = l[i]; j <= r[i]; j++) {
			id[j] = i;
		}
	}
	vector<vector<int> > v(cnt * cnt + 1, vector<int>(2 * n, 0)); 
//
	for (int i = 1; i <= cnt; i++) {
		for (int j = i; j <= cnt; j++) {
			for (int k = l[i]; k <= r[j]; k++) {
				v[_Pos(i, j)][a[k]]++;
			}
			int mx = 0, _S = 0;
			for (int k = 1; k <= n; k++) {
				if (mx < v[_Pos(i, j)][k] || mx == v[_Pos(i, j)][k] && _S > k) {
					mx = v[_Pos(i, j)][k];
					_S = k;
				}
			}
			s[_Pos(i, j)] = _S;
		}
	} 
//
	vector<int> N(n + 1, 0);
	int _X = 0;
	for (int i = 1, L, R; i <= m; i++) {
		cin >> L >> R;
		L = (L + _X - 1) % n + 1, R = (R + _X - 1) % n + 1; 
		assert(L >= 0 && R >= 0);
//		cout << L << ' ' << R <<endl;
		if (L > R) swap(L, R);
		int mx = 0, _S = 0;
		if (id[L] == id[R]) {
			for (int j = L; j <= R; j++) {
				N[a[j]]++;
				if (mx < N[a[j]] || mx == N[a[j]] && _S > a[j]) mx = N[a[j]], _S = a[j];
			}
		}
		else {
			// Left 
			for (int j = L; id[j] == id[L]; j++) {
				N[a[j]]++;
				if (N[a[j]] == 1) {
					if (id[L] + 1 < id[R]) {
						N[a[j]] += v[_Pos(id[L] + 1, id[R] - 1)][a[j]];
					}
				}
				if (mx < N[a[j]] || mx == N[a[j]] && _S > a[j]) mx = N[a[j]], _S = a[j];
			}
			
			// Right
			for (int j = R; id[j] == id[R]; j--) {
				N[a[j]]++;
				if (N[a[j]] == 1) {
					if (id[L] + 1 < id[R]) {
						N[a[j]] += v[_Pos(id[L] + 1, id[R] - 1)][a[j]];
					}
				}
				if (mx < N[a[j]] || mx == N[a[j]] && _S > a[j]) mx = N[a[j]], _S = a[j];
			}
			
			// Mid 
			if (id[L] + 1 < id[R] && N[s[_Pos(id[L] + 1, id[R] - 1)]] == 0) {
				int _O = s[_Pos(id[L] + 1, id[R] - 1)];
				int Tmp = v[_Pos(id[L] + 1, id[R] - 1)][_O];
				if (mx < Tmp || mx == Tmp && _S > _O) {
					mx = Tmp;
					_S = _O;
				}
			} 
		}
		_X = b[_S];
		cout << _X << endl;
// clear 
		for (int j = L; id[j] == id[L]; j++) N[a[j]] = 0;
		for (int j = R; id[j] == id[R]; j--) N[a[j]] = 0;
//		for (int j = 1; j <= n; j++) {
//			assert(!N[j]);
//		} 
	}
	return 0;
}
2023/3/21 13:53
加载中...