AT_abc470_d
首先证明:变换两次一定会变成原来的数列。
:::success[证明]
假设变换数列
我们来算
设
- 在
a 交换两个数,由b_{a_i}=i 可得,交换b_{a_x} 和b_{a_y} ; - 在
b 交换两个数,由a_{b_i}=i 可得,交换a_{b_x} 和a_{b_y} 。int n, q, op, x, y, a[55n], b[55n]; bool f; signed main() { read(n, q), read(a, n); rep(i, 1, n) b[a[i]] = i; while(q--) { read(op); if(op == 1) { read(x, y); if(f) swap(a[b[x]], a[b[y]]), swap(b[x], b[y]); else swap(a[x], a[y]), swap(b[a[x]], b[a[y]]); } else f = !f; } if(f) rep(i, 1, n) write(b[i], ' '); else rep(i, 1, n) write(a[i], ' '); return 0; }