Codeforces Round 1024 (Div. 2)题解
推荐曲目:センチメートル
- A. Dinner Time
题意概括:给你n、m、p、q这4个正整数,表示有一个n长度的序列,这个序列的每p个连续元素的和为q,你需要构造一个序列,其中元素为任意整数,保证其和为m。
请输出是否可能。
题解:可以深入思考一下一个固定长区间的构造方法。
比如说p=3,q=5,我们可以在序列中以[-1,7,-1]或者[-1,-1,7],甚至是[9,-2,-2]为循环节构造区间。
可以观察到,无论是负数的大小,还是负数的位置,都可以任意指定。正数也如此。
如果这个循环节到最后是不完全的,也就是说n=5,p=3之类的,最后一定会只放得下循环节的一个前缀,而上述观察告诉我们,这个前缀的大小是可以任意构造的,也就是说最后和一定能够等于m。
如果循环节完全,那么序列的元素和固定为循环节数量乘q,判断是否等于m即可。
- B. The Picky Cat
题意概括:给你一个整数序列,你可以任意次数使得一个数等于其相反数,最后要使得在下标1的那个数字为中位数,输出是否可能。
题解:为方便,将下标为1的那个数字记为x
首先,因为你可以任意使一个数变成其相反数,我们可以直接将所有数都翻成非负数在数轴上观察。
可以发现,绝对值大于等于x的数,可以自由选择在x的左右边,而其余的数,在x左右边只取决于x的正负,很简单,只需要自由的大于等于其余的,x就能变成中位数。
特殊的,n为偶数时,自由的大于其余的+1即可(因为x只需要为n/2)
- C. Mex in the Grid
题意概括:你需要构造一个nn的矩阵,包含0到nn-1各一个,你需要保证其每个子矩阵中元素mex的和最大。
题解:只需要把每次的元素都放在可以放到的离0最近的地方且连续就好,因为要保证mex最大,那么先接触的矩阵一定是每次都接触下个连续元素的矩阵,要保证这个矩阵在后续扩张中总和最大,最后就是保证其人为走的每一步都包含最多mex中元素。
换句话来说就是guass(逃
- D. Quartet Swapping
题意概括:给你一个长n排列,你可以无限次选择连续4个元素,然后交换1与3,2与4,最后使得这个排列字典序尽可能小。
题解:交换元素不能改变元素所在位置的奇偶。
拿长为5的排列玩,就会发现有这样一种交换手法:
可以选择排列中任意两对交换,因为这个交换方式本质上和冒泡相等,所以两对元素可以在距离为偶数的情况下置换,如果是奇数,那么也可以交换(自己推下)。
那么我们直接贪心交换,每次使得奇偶位置最小的元素放在前面,一直到n-4停止即可。
那么为什么排列中的最后三位顺序一定是可能情况下最优的呢?
我不知道,自己拿长5的排列玩就好了。
- E. 23 Kingdom
题意概括:给你一个正整数序列,你可以无限次将任意正整数变成小于等于它的另一个正整数,最后对于序列中的每个存在的正整数,将它们下标的最大值与最小值相减就是这个正整数的贡献,求贡献和。
题解:因为每个正整数提供贡献仅取决于左右两边的下标,所以对于每一个正整数,我们都只选择两个下标来取代它。
首先,假设序列最后有着k对数,那么正整数一定能够看成一个k的排列。
这个求法很简单,只需要把大于k的所有数加入一个数据结构,在每一步先加入等于i的所有下标,然后找出最大最小的两个数计算贡献并删除即可。
可以证明,这一定是恰好选择k对数的最大贡献(从k为1开始理解)
这个贡献是一个单峰函数。
为什么,注意到一个手捏样例:1,1,2,2,这个样例的答案应该是3,但如果k=2的话,答案就是2,也就是说,选择多对k,那么对于上游的贪心,一定是有着递减的效应的。
再看看为什么k小的时候答案显然递增。
因为数对不够了,对于一个k=1的答案,这个正整数的数对一定是最高质量的,但是不排除会有上面的某对依然可能形成一对,因此可能会递增。
为什么一定是单峰函数。
仔细想想前面为什么会递增,因为上游的可能会新构成一对使得答案可能增加,如果新增了一对使得答案减少,那么更上游的选择,答案一定是更劣的,所以会一直单减。
三分维护单峰,但check用set会超时,可以用线段树加二分维护。
浙公网安备 33010602011771号