初始想法肯定是构造 k=0 的矩阵。
然后 k=1,就直接交换行列。
k=2,就根据根据初始矩阵两个数是否在同一集合和最后要求两个数是否在同一集合进行合并或分拆。
合并,只需将两个数交换到相邻行,然后进行合并,分讨最小次小最大次大是否交换即可。
分拆同理。
发现很多情况跑不出来。
本质原因是矩阵不优,我们考虑手动构造矩阵进行合并和分拆。
观察原矩阵的形式,发现只需要考虑两个数都在 [1,n]∪[n(n−1)+1,n2] 的情况。
此时我们只有查询 i,i+n(n−1) 或 1,n2 或 n,n2 是才需要分拆,放到后面考虑。
考虑合并,无非就是将手动构造将两个数放到同行或同列。
构造矩阵很烦,我们打表。
link
弄出一堆表,找规律就行了。
补充题解没有的几张表。
bi,i=i+[i≥x],bi+1,i=n(n−1)+i+[i≥x−1],b1,n=n(n−1)+x−1,by,n=x
bi,i=i+[i≥x],bi+1,i=n(n−1)+i+1,b1,n−1=n(n−1)+1,b1,n=x
bi,i=i+[i≥x](i≤n−1),bi+1,i=n(n−1)+i+[i≥x−1],b1,n−1=n(n−1),b1,n=x,bn,n=n(n−1)+x−1,an,1=n+1
分拆的情况也考虑在合并的表内了。
把每个表都带到上面算法里就一定能跑出解。