CCPC2021-哈尔滨
因为一些不可抗力原因贴不了代码,只能讲讲解题思路。
B
Description
给定一个数组,可以在其中取出一个长度为偶数的子序列,满足\(a'_{2i-1}+a'_{2i}\)的值都相等,求子序列长度的最大值。
Solution
观察到\(a_i\)范围很小,枚举和的值,记录每个和对应的最大子序列长度,求最大值。
求当前和对应的最大子序列长度:从左到右扫描,能够和前面在上一对之后的数字成对的话,就把这对加到答案里即可。这个过程用桶记录,two pointes维护。
D
Description
对约分进行重定义,如果\(\frac{p}{q}=\frac{p'}{q'}\)且p'、q'分别可以通过p、q同时删去相同的数得到,那么就称这个过程为约分。求满足约分条件的最小p'、q'、
Solution
由于p,q的数位范围<20,所以我们考虑枚举p的每一位删于不删,得到p‘。
\(q'=\frac{p'q}{p}\),只要q'为整数且p'、q'分别可以通过p、q同时删去相同的数得到,即他们删去的0~9的个数一一相等,那么便为一次合法的约分。对p',q'取最小值即可。
E
Description
给定一个数组,希望知道满足\(2^{i-1}\;mod\;M=a_i\)的M是否唯一,并求出唯一值。
Solution
找到第一个不满足\(a_i=2^{i-1}\)的i,记为x。若全满足,则任意大于\(a_n\)的数都可以是M。
\(a_x=2^{x-1}\;mod\;M\)且\(M\in(2^{x-2},2^{x-1})\),故\(M=2^{x-1}-a_x\)。对x后面的数进行验证即可。
但有一组特殊情况,若x=1,按上面的式子算\(M=1-a_x\),若\(a_x\geq1,M\leq0\),不合法;若\(a_x=0\),M=1,对x后面的数进行验证即可。
I
Description
给定一个数组,每次可以对任意一个下标数组idx(不要求数组元素互不相同),将\(a_{idx_i}-2^{i-1}\)。求最少操作几次可以使数组全为0。
Solution
问题可以转化为将所有数按二进制拆位,\(t_i\)记录\(2^i\)出现的次数。
显然,\(2^i\)要么作为\(2^i\)被消掉,要么被拆分成更小的\(2^j\)被消掉。
我们希望最后得到的t序列是单调不上升的且\(t_0\)尽可能小。
二分答案ans,然后贪心判断即可。
判断方法:
从左到右扫描\(t_i\),记还需向后面借debt个\(2^i\)。我们希望在不打破单调不上升的基础上,尽量多借,已便让后面的数尽可能小。
随着i增加,debt按2的倍数下降(\(2^idebt=2^{i'}debt'\))。
若当前\(t_i\)<ans,则要向后面借\(2^i\),即\(debt=debt+ans-t_i\)。
若当前\(t_i\)>ans,则要还前面借的\(2^i\),即\(debt=debt-(t_i-ans)=debt+ans-t_i\)。
因为只可能向后面借到偶数个\(2^i\),所以若debt为奇数,那就只能少借/少还,即\(debt=debt+ans-t_i-1\),对i及i之后的\(t_i\)能达到的ans-1。
J
Description
给定一个矩阵,求多少个数满足:是自己那行的最小值 且 是自己那列的最小值。
Solution
纯模拟。