Codeforces Round #842 (Div. 2) 题解(A-E)

A Greatest Convex 签到题,注意到x=k-1必定满足题意。

B Quick Sort 其实就是找最大的不需要进行题目中sort操作的序列,那一定是按照顺序的1,2,3,4……是原排列的子序列,剩下的数字就是要进行操作的。操作数整除k并向上取整即为最终结果。

C Elemental Decompress

题目中给出的输入是随意的,因此可能出现数字出现的次数大于等于3,这种情况一定不符合题意,需要特判。然后把出现过2次的和出现0次的数字交换,并从小开始给每个出现2次的数字配一个最小的出现0次的数字,若即使这么操作仍然发现出现0次的数字比出现2次的数字大,则不合题意。该方法时间复杂度O(n)。

另解:也可以通过排序,a[i]>=i,且所有数字出现次数不能小于等于3则符合题意,排序的时候把原位置储存成结构体或pair一起排序,然后再转化回原位置输出结果。该方法时间复杂度O(nlog(n))也可过。

D Lucky Permutation

先举个例子,如n=4时,只有

2,1,3,4;

1,3,2,4;

1,2,4,3,三种符合题意。

这一定和1,2,3,4这样按顺序sort的排列相差一步操作。

我们先找将排列按顺序sort需要的swap次数,对于这个简化问题,令p[i]=i所产生的环的元素数-1为每个环按顺序sort所需的操作数。

因此,若有c个环,则n-c就是所需的操作数。

在考虑原来的问题,如果有一个环里的两个相邻的数相差1,意味着可以不用sort这两个数,因此可以少走一步。若不存在这样的情况,则需多走一步。

E Partical Sorting

首先,我们发现对于任何排列都可以使用最多3次操作达成目的。

0次操作达成目的的排列个数为cnt0=1——原排列。

1次以内操作达成目的的排列个数,要么0-n区间(左闭右开,下同)内是位置正确的,要么2n-3n如此,注意这两种情况分别为(2n)!,但重合了n!,故排列个数为cnt1=2×(2n!)−(n!)。

因此,本题还需求2次以内的操作能达成目的的排列个数。

该情况下,要么最小的n个数在0-2n间,要么最大的n个数在n-3n间,这样先把这个区间内的数sort一遍,然后再sort另一边,需要2次。

这两种情况分别为C(2n,n)*n!*(2n)!,并重合了一个区间。

这个重合区间要求最小n个数在0-2n间且最大的n个数在n-3n间,对于这种情况,我们可以枚举n-2n区间内有i个这样的数,这样的话0-n和2n-3n内均有n-i个这样的数,最终结果为C(n,n-i)×C(n,i)×C(2n,n)−i×n!×n!×n!

故cnt2=C(2n,n)*n!*(2n)!- 求和 (C(n,n-i)×C(n,i)×C(2n,n)−i×n!×n!×n!)

总排列数显然为cnt3=(3n)!

因此最终结果为3*cnt3-cnt2-cnt1-cnt0

你可能感兴趣的:(codeforces题解,c++,算法)