codeforces724-B. Batch Sort
想着想着就忘了有什么问题没解决,坑啊
一开始读错题意了,而且一着急写了两大段差不多的代码,冗余度啊,不说了。。
显然的一点,给的数据是绝对离散的,每行都是1~m的排列
难点一、如何移动能使未排序的数组移动后有序,并且移动步数最小
从前到后,遇到不是位置等于名次的数,就和在他名次的位置的那个数的位置交换
算法可以保证终止,但不能证明其最小
//其实只要小于n+1
发现事实:对于相同的交换操作,如果每一行都有,我们显然可以都顺便做掉
难点二、移动先后的选择,如果你先移动好了一个有序组,后面又加了交换所有行的两列操作
你这个操作很可能就被无效化了,
(所以解决方案之1是先进行交换所有行的两列的操作,然后进行交换单行的两列)
1 3 2 4
1 3 4 2
1 3 4 2
1 3 4 2
当然这个调整的方法是我上面自己想的。。
这个数据,我们先把第一组单列调整有序,不波及其他的行的列
然后后面的三个一起调整,当后面的调整好了之后,我们发现第一组无序了
然后还有剩余步数,它只动自己的次数已经用完,所以每次交换所有行的列
当第一组又变得有序的时候,第一步数超了,第二其他组都不是有序的了
当有某一组单独有序的时候,我们不能保证调整波及有序组之后
这一组变无序之后还能在有限合法步数内变成有序,而且变换后
所有组都是有序的
搞不动了,我发现好像没什么规律,然后想写个暴力冲一发,这是q神的策略之一,看不出规律就暴力冲一发
我发现暴力好像不太好写啊。。
我又发现一个事实,当我对于整体里有一个有序组的情况困惑时
我手算了一下,如果你每次移动都带着一个有序组,当前有无序组,那么由于一一对应的关系,无论你怎么交换
最后肯定有无序的,
所以说碰到有序组,要考虑每组一个单独的列交换要么花在这个有序组变无序又想变有序的过程中
要么花在其他无序组
上面那个操作可以简单解释为,用了单独列交换变成有序组,然后其他组带着有序组交换,有序组最终变无序
其他组又变有序,此时又没有什么单独列交换可做,只做所有行的列交换已经被证明不可以
尽量多的组变成有序,其他剩下的组每个用一次单独列交换
这样会不会比全部单独列交换
或者所有行列交换和单独列交换各占一部分
的步数多呢。。
我刚刚想解决的问题是,对应两组数,选定之后对应的两个列,交换后有什么后果
如果其中一个组的两个列都在自己对应的位置,那么交换后,对应位置只增不减,要么另外一组变有序,这组有序变无序,要么两个都变无序
都不在对应位置,相同的话,交换后可能都在对应位置
选择某一组进行调整,那么如果你选的顺序不同会造成,对于完全相同的组的所有行列交换操作的影响
还是在困惑如何解决这个可行性的问题,判定方法一般在题目里
所以我又想起来,我还是去求最小值,然后判最小值的大小,或者暴力求可行解
两个都错位的序列是有区别的,2,1,4,3和2,3,4,1 虽然说都错位了,但是像这种1,2变成2,1的距离有序序列的距离就短
手算了一下2,3,4,1 我发现无论交换顺序如何(每次交换到自己的本位),交换步数不变。。
按这样的交换的方法,无序组最多交换n-1次就能变成有序的,因为每次交换都至少让一个元素就位(会有两个),而已经就位的元素就不会有元素再指向它目前的位置(它不动了,稳了)
考虑一组样例,若干只交换某一个元素就能变成完全相同的序列(交换距离为1),还有若干完全跟这些序列不同的序列。。
如果没法判别这些序列。。
(不能保证劳动成果的交换,我们是不是都不应该考虑呢)
关键是在都不相同的情况下,如果考虑每个单换成有序的,
1 3 2 4
1 3 4 2
我考虑了最后一步是什么操作,好像不太确定。。
一步能变成有序的话,我们不动它,然后变换成最像那个一步变换成有序的序列,如果都变换得很像的话。。最后用所有行的列交换,把若干相同的序列一步交换变成有序
但是对于
2 1 3 4 5 6
1 2 4 3 5 6
1 2 3 4 6 5
谁都变不成谁。。特判吧。。都是一步成仙的,就直接ok好了。。
对于
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
有这种直接有序的组。。先算一下剩下的组单列能不能一步升仙,然后找不到一步升仙的,也找不到像的。。
(最后考虑多个相同组的全行列交换,交换后不满足条件的看能不能单列一步升仙)
我发现这个跟完全有序的组的数量有关。。
假设前面这种组为n,而后面组数量为m,变成一步相似组,m-1,最后来一步交换+1,还是m,但是前面的n组从有序变成了无序
变回来还要+n,所以一共是n+m
如果我们不集体处理的话,后m组就会变成1+(m-1),不动前面的n组就只能组内移动一次,所以如果可能的话是m,不过这很可能导致NO的结果
我觉得题目中最勉强的情况是。。都一步变换成同一个一步成仙型,然后都一步到位?