分块,RE on test 9求助
查看原帖
分块,RE on test 9求助
173660
zhoukangyang楼主2021/2/4 07:15

RT,程序如下:

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j, i##E = k; i <= i##E; i++)
#define R(i, j, k) for(int i = j, i##E = k; i >= i##E; i--)
#define ll long long
#define ull unsigned long long
#define db long double
#define pii pair<int, int>
#define mkp make_pair
#define sz(x) ((int) x.size())
#define be(x) x.begin()
#define en(x) x.end()
using namespace std;
const int N = 1e5 + 7;
const int B = 320;
int n, m, a[N], lastans, cnt[N / B + 5][N], Bl[N], Br[N], id[N];
deque<int> q[N / B + 5];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n;
	L(i, 1, n) cin >> a[i];
	L(i, 1, n) id[i] = (i - 1) / B + 1;
	L(i, 1, id[n]) Bl[i] = (i - 1) * B + 1, Br[i] = min(i * B, n);
	L(i, 1, n) q[id[i]].push_back(a[i]), cnt[id[i]][a[i]] ++;
	cin >> m;
	while(m--) {
		int opt, l, r, k; cin >> opt >> l >> r;
		l = (l + lastans - 1) % n + 1, r = (r + lastans - 1) % n + 1;
		if(l > r) swap(l, r);
		int idl = id[l], idr = id[r];
		if(l < 0 || r < 0) exit(0);
		if(opt == 2) {
			cin >> k, k = (k + lastans - 1) % n + 1;
			if(k < 0) exit(0);
			int sum = 0;
			if(idl == idr) L(i, l, r) sum += q[idl][i - Bl[idl]] == k;
			else {
				L(i, idl + 1, idr - 1) sum += cnt[i][k];
				L(i, l, Br[idl]) sum += q[idl][i - Bl[idl]] == k;
				L(i, Bl[idr], r) sum += q[idr][i - Bl[idr]] == k;
			}
			cout << (lastans = sum) << "\n";
		}
		else {
			int v;
			if(idl == idr) 
				v = q[idl][r - Bl[idl]], q[idl].erase(be(q[idl]) + r - Bl[idl]), q[idl].insert(be(q[idl]) + l - Bl[idl], v);
			else {
				for(int i = idl; i < idr; ) 
					v = q[i].back(), cnt[i][v] --, q[i].pop_back(), i ++, q[i].push_front(v), cnt[i][v] ++;
				v = q[idr][r - Bl[idr] + 1], cnt[idr][v] --, q[idr].erase(be(q[idr]) + r - Bl[idr] + 1);
				if(l - Bl[idl] > sz(q[idl])) exit(0);
				q[idl].insert(be(q[idl]) + l - Bl[idl], v), cnt[idl][v] ++;
			}
		}
	}
	return 0;
}
2021/2/4 07:15
加载中...