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