1009

Done OI Start at: 2025-10-9 13:45 3.5 hour(s) Host: 40

题解

/*
{0,1,2}a->a b->b c->c
{0,2,1}a->a b->c c->b
{1,0,2}a->b b->a c->c
{1,2,0}a->b b->c c->a
{2,0,1}a->c b->a c->b
{2,1,0}a->c b->b c->a
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;

struct node {
	int val[3];
	friend node operator + (node a, node b) {
		node c;
		c.val[0] = b.val[a.val[0]];
		c.val[1] = b.val[a.val[1]];
		c.val[2] = b.val[a.val[2]];
		return c;
	}
} tree[N << 2][6], tag[N << 2], change[6], base[6];
int rk[3][3][3], a[N]; //rk[0][1][2] = 0
string s;
int n, m;

void pushup(int rt) {
	for (int i = 0; i < 6; i++) {
		tree[rt][i] = tree[rt << 1][i] + tree[rt << 1 | 1][i];
	}
}

int check(node a) {
	return a.val[0] == 0 && a.val[1] == 1 && a.val[2] == 2;
}

void add(int rt, node p) {
	//输入0->p.val[0]  输入?会变成0
	int pre[3], cur[3];
	node tmp[6];
	pre[p.val[0]] = 0;
	pre[p.val[1]] = 1;
	pre[p.val[2]] = 2;
	cur[pre[0]] = 0;
	cur[pre[1]] = 1;
	cur[pre[2]] = 2;
	tmp[0] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];
	cur[pre[0]] = 0;
	cur[pre[1]] = 2;
	cur[pre[2]] = 1;
	tmp[1] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];
	cur[pre[0]] = 1;
	cur[pre[1]] = 0;
	cur[pre[2]] = 2;
	tmp[2] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];
	cur[pre[0]] = 1;
	cur[pre[1]] = 2;
	cur[pre[2]] = 0;
	tmp[3] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];
	cur[pre[0]] = 2;
	cur[pre[1]] = 0;
	cur[pre[2]] = 1;
	tmp[4] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];
	cur[pre[0]] = 2;
	cur[pre[1]] = 1;
	cur[pre[2]] = 0;
	tmp[5] = tree[rt][rk[cur[0]][cur[1]][cur[2]]];

	for (int i = 0; i < 6; i++) {
		tree[rt][i] = tmp[i];
	}
	tag[rt] = tag[rt] + p;
}

void pushdown(int rt) {
	if (check(tag[rt]))
		return;
	add(rt << 1, tag[rt]);
	add(rt << 1 | 1, tag[rt]);
	tag[rt] = {0, 1, 2};
}

void build(int l, int r, int rt) {
	tag[rt] = {0, 1, 2};
	if (l == r) {
		for (int i = 0; i < 6; i++) {
			tree[rt][i] = base[change[i].val[a[l]]];
			//rt节点,经过0号变换后,遇到0=0 1=1 2=2
		}
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, rt << 1);
	build(mid + 1, r, rt << 1 | 1);
	pushup(rt);
}

void update(int l, int r, int rt, int L, int R, node p) {
	if (L <= l && r <= R) {
		add(rt, p);
		return;
	}
	pushdown(rt);
	int mid = (l + r) >> 1;
	if (L <= mid)
		update(l, mid, rt << 1, L, R, p);
	if (R > mid)
		update(mid + 1, r, rt << 1 | 1, L, R, p);
	pushup(rt);
}

node query(int l, int r, int rt, int L, int R) {
	if (L <= l && r <= R) {
		return tree[rt][0];
	}
	pushdown(rt);
	int mid = (l + r) >> 1;
	if (R <= mid)
		return query(l, mid, rt << 1, L, R);
	if (L > mid)
		return query(mid + 1, r, rt << 1 | 1, L, R);
	return query(l, mid, rt << 1, L, R) + query(mid + 1, r, rt << 1 | 1, L, R);
}

int main() {
	freopen("jkp.in", "r", stdin);
	freopen("jkp.out", "w", stdout);
	change[0] = {0, 1, 2};
	change[1] = {0, 2, 1};
	change[2] = {1, 0, 2};
	change[3] = {1, 2, 0};
	change[4] = {2, 0, 1};
	change[5] = {2, 1, 0};
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			base[i].val[j] = i;
		}
	}
	base[0].val[2] = 2;
	base[1].val[0] = 0;
	base[2].val[1] = 1;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				for (int p = 0; p < 6; p++) {
					if (change[p].val[0] == i && change[p].val[1] == j && change[p].val[2] == k)
						rk[i][j][k] = p;
				}
			}
		}
	}
	cin >> n >> m;
	cin >> s;
	for (int i = 1; i <= n; i++) {
		a[i] = s[i - 1] - 'A';
	}
	build(1, n, 1);
	while (m--) {
		int pos, l, r;
		char x, y;
		cin >> pos >> l >> r >> x;
		if (pos == 0) {
			cin >> y;
			node tmp = {0, 1, 2};
			tmp.val[x - 'A'] = y - 'A';
			tmp.val[y - 'A'] = x - 'A';
			update(1, n, 1, l, r, tmp);
		} else {
			node res = query(1, n, 1, l, r);
			cout << char(res.val[x - 'A'] + 'A') << endl;
		}
	}
	return 0;
}
/*
1 9 3 2 4 6 7 8
1 9 3 2 4 6 8 7
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int T, n, a[N], b[N];

int main() {
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout);
	cin >> T;
	while (T--) {
		cin >> n;
		vector<pair<int, int> >res;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
		}
		for (int i = 1; i <= n; i++) {
			cin >> b[i];
		}
		int flag = 0;
		for (int i = 1; i <= n; i++) {
			if (flag == 1)
				break;
			if (a[i] == b[i])
				continue;
			else if (a[i] > b[i]) {

				int minn = 1e9;
				for (int j = i + 1; j <= n; j++) {
					minn = min(minn, a[j]);
					if (a[j] == b[i] && a[j] == minn) {
						for (int k = j - 1; k >= i; k--) {
							swap(a[k], a[k + 1]);
							res.push_back({k, k + 1});
						}
						break;
					} else if (a[j] == b[i] && a[j] != minn) {
						flag = 1;
						break;
					}
					if (flag)
						break;
				}

			} else {
				flag = 1;
				break;
			}
		}
		if (flag == 0) {
			cout << 0 << endl;
			cout << res.size() << endl;
			for (auto v : res) {
				cout << v.first << " " << v.second << endl;
			}
		} else {
			cout << -1 << endl;
		}
	}
	return 0;
}
Status
Done
Rule
OI
Problem
4
Start at
2025-10-9 13:45
End at
2025-10-9 17:15
Duration
3.5 hour(s)
Host
Partic.
40