CF1713E Cross Swapping 做题记录

给定一个 n×nn\times n 的矩阵。一次操作可以给定一个 kk 然后交换所有的 Ai,kA_{i,k}Ak,iA_{k,i}

如图表示 n=4,k=3n=4,k=3 的情况。

求若干次操作后字典序最小的矩阵。

1n10001 \leq n \leq 1000

显然一个位置 (x,y)(x,y) 上的数只能被交换到 (y,x)(y,x),并且当且仅当 k=xk=xk=yk=y 操作的执行状态不同才会被交换

发现字典序最小肯定是尽量让前面的位置上的数更小,那么按照 x,yx,y 升序的顺序遍历所有满足 x<yx<y 的位置 (x,y)(x,y),若 ax,y<ay,xa_{x,y}<a_{y,x} 显然是让 k=xk=xk=yk=y 操作的执行状态相同更优,否则不同更优。

考虑维护“两个操作的执行状态相同/不同”这个东西,显然可以考虑把 k=xk=x 操作拆成两个点 xxx+nx+n,用并查集维护。遍历到 (x,y)(x,y) 时,若 k=xk=xk=yk=y 操作的执行状态相同,那么合并 x,yx,yx+n,y+nx+n,y+n 所处的集合,否则合并 x,y+nx,y+nx+n,yx+n,y 所处的集合。注意若 xxy+ny+n 处于一个集合即 k=xk=xk=yk=y 操作的执行状态不同前面的更优那么就不能合并 x,yx,yx+n,y+nx+n,y+n 所处的集合;xxyy 处于一个集合同理。

最后再按照 x,yx,y 升序的顺序遍历所有满足 x<yx<y 的位置 (x,y)(x,y),若 xxy+ny+n 在同一个集合即 k=xk=xk=yk=y 操作的执行状态不同那么交换 ax,ya_{x,y}ay,xa_{y,x},即可找到答案。