# codeforces #631Div2(A-D)

codeforces #631Div2(A-D)

A

(题意可把我看坏了,就是一个很厉害的人想要当操盘手,想要集齐前x个排名,可以重复,但是前ans个排名必须是完整的,比如ans等于5的话 1 2 3 4 5 必须都集齐,1 1 3 4 5 这样就不算集齐了)
输入:n(已经比完的比赛),x(还剩几场比赛)
输出:ans(假设他是一个很厉害的操盘手,能操盘的最大的ans是多少)
想法:因为数据特别小,所以就从第一名开始往后暴力,如果没有拿过的名次,就消耗一个x,如果拿过了(可以开一个数组记录),就往上跑,直到x即将为-1的时候break就行了,输出跑到的地方。

B

题意:cf描述了一下全排列的概念,然后给出一个数组,问这个数组是否能由左右两个全排列构成。而且如果有多种可能就输出所有可能。
输入:n (数组大小)
输出:ans(可能的数量) 还有每种可能的左排列的长度和右排列的长度。
想法:
我看到题目就想到了全排列的一个小特性,就是他们的和为(i+1)*i/2,然后我记录了一下总和和前缀和,写了一个check,从1到n暴力,check前缀和和后缀和是不是都是排列的特性,果不其然wa了,因为2+2+2== 6==1+2+3,唉,头很铁,没想到,还wa了两次,自己写了这个数据才想到,然后解决方法就是用set或者随便来个数组标记不重复数字的数量,看看前缀不重复数字的数量是不是i 后面是不是n-i就行,满足了这两个特征就是全排列啦。(这两个特征可以记一记噢)

C

题意:给出一个从左到右的n个什么东西(假设是方块吧)然后给你m个不同颜色的染色剂,这些染色剂的剂量为len i,就是从一个起点开始能往右染 len i 个方块,后染的染色剂会覆盖之前染色的染色剂,要求满足两个条件,一是所有方块都得被染起来,二是所有的颜色都至少会有一种,就是先染的染色剂不能全被覆盖掉的意思。根据这两个条件来的话,思路就要缩小范围了,一是因为所有的方块都得被染,所以可以想到贪心,贪就贪所有颜色都不覆盖其他颜色,但因为有第二个条件,所有颜色都得被看到,这个也是贪心,那就是先染的颜色都留下一个方块以示尊严,其他的染色剂都跟在上一个颜色后面一个方块作为起点,但这样又很可能染不满所有方块,那思路根据这两个贪心就会清晰起来,先贪第二种,再贪第一种,也就是说,当你染色剂的染色能力总和大于剩下的方块数的时候,按照第二种贪心来,否则的话,按照第一种来,这样就两全其美了,这题我觉得有必要贴一下代码,很重要的部分我已经注释起来了。
https://pasteme.cn/32258
突然发现输入输出忘记写了。。。。。。。详情请见https://codeforces.ml/contest/1330/problem/C

D

(侯老师说他调了很久的时候,我那时候还剩40min,幸好没选择下班,挣扎了一下,找规律过的。
题意:给两个数d,m,寻找满足条件的a数组的数量
条件是,1.长度任意 2.严格递增 3.要让b数组也严格递增
b数组的定义:b1=a1,bi=bi-1 xor ai
输入: d,m
输出:num%m
想法:
一看到范围1e9 1e9,其实就知道 按照1++的暴力是不可能了,那么会不会是成倍往上涨的暴力呢,一开始我也不清楚,于是开始手写规模比较小的数字,当d为1的时候,a只能为1 所以答案为1, 当d等于2的时候,枚举a长度为1的话 a数组可能为 1 也可能为2 ,长度为2的话 前两个条件限制之后就只剩1 2 。再看看1 2 是否满足条件三,b1=1 b2=2xor1=3 所以也满足 ,答案一共有三种,当d为3的时候 满足条件一二的所有情况为 1 2 3 ,1 2, 2 3,1 3 ,1 ,2,3 后面三种显然是可以的,那就手推一下前面四种,b数组分别为 1 3 0,1 3 ,2 1,1 2 ,一共有两种可以,所以答案为五,现在手推d=4的时候,不着急全部写出来满足一二的情况,因为容易发现b数组中前面的数是不会被后面的影响的,所以枚举最初的情况只要枚举d=3的情况就行了,因为如果在d=3中被排除掉的可能性,在d=4中也必然不会出现,但是d=3中符合条件的可能性,在d=4中也必然符合 因为长度任意嘛,你取三可以那我取4也可以,所以后面的答案是一步步由前面递推而来的,那么d=4到底等于多少呢,=ans(3)+x+1,这个x为ans(3)中的所有可能之后再加上4看看符不符合,比如说ans(3)中满足排列的有 1 ,2,3,1 2, 1 3,那就在这些排列之后再加个4,看看b数组是不是满足递增,一个神奇的事情发生了,所有排列加个4都没啥问题,因为4这个数是二的幂次,与之前的bi-1亦或的话,都会得到比bi-1还要大的数,这个可以写个二进制数理解理解噢,所以ans(4)就出炉啦,等于两倍的ans3,但是别忘了还有4这个单独的数噢,所以ans4=ans3*2+1;
再然后就是5了,5我就不手推了,简单描述一下,5的二进制数是101,在4那一位上是有1的,所以ans5对于ans3的所有排列来说都是满足条件三的,跟ans4一样,但是对于ans4的所有排列来说,又必然是不满足条件三的,因为会4xor4抵消掉嘛,那就变小了,所以ans5也比较容易的出炉了,就是ans5=ans4+ans4-ans3,ans3重复算了要减去噢,然后就得到递推式啦,看样例找规律验证一下woc还真是,当时我发现的时候还剩半个小时,贼兴奋,然后开始写代码,发现还是卡卡的,因为想的容易操作难嘛,但是这个模拟还是需要自己练一练的,我就不给代码啦。

总结一下这次比赛,我觉得打得好的原因还是因为运气好,题目都偏模拟,我的技能还是太少,e题都不敢看,希望大家能打好模拟的基础,早日上蓝!

学长学姐还有19级的神仙们就不要嘲笑我这个大白话了呜呜呜

你可能感兴趣的:(# codeforces #631Div2(A-D))