Codeforces Round 951 (Div. 2)

A题没什么好说的。

B题目读懂了基本就会了。
首先很明显,如果x和y的某一位不一样,那这两位异或同一个数字自然也是不一样的。
所以要做的就是找到二进制里面最长的连续相同的数量。
这个时候看看样例,1 4 8 全是2的整数次方,33554432,计算器算一下,发现居然也是。那就非常明显了。
直接从低位向高位,一位一位的找是否相同,这一位相同就继续找下一位,如果不同就退出。
找到最多几位相同,设为\(ans\)\(2^{ans}\)就是答案。

C题做起来就更炸裂了。\(n\leq 50\) , $k\leq 20 $
看看样例,发现7,9,13,17,5,2,3这种数字出现的比例有点高,盲猜一手答案和质数相关。
20以下的质数最大19 。
尝试先摸一下贪心,做cf题日常贪心起手。
发现倍率大的肯定要压的少。
那就考虑一个做法,最大的位置先钦定为压一块钱,然后去填写下一位。如果超过了这一位的承受能力,就回来给他加上钱。
很明显会T,而且无解的情况需要再推导。
但是这个某种程度上给出了这个形成的思路。
首先5个5是做不到的,而2个3是能够做到的。
而为什么第一个做不到,因为收益率总是无法覆盖付出。而是否存在一种最优分配方案呢。对于上面说的两种,就存在,全填1 。
看看样例。发现似乎所有的填写都和最大公倍数是强相关的。
mmsd,不就是最大公倍数吗。先按照最大公倍数填,如果做不到覆盖,就是无解。样例过了。ac了。
抽象。

想想怎么证明,其实思路就是那个最优策略的存在性。
要写式子证明。。大体的思路就是先假设最优解就是让所有的点在赢的时候得到的回报是一个相同的数字,然后论证这个相同的数字小于你的支出的时候,不管如何调整,总是无法达到答案要求。如何就证明了上面的这个最大公倍数的解法是正确的。
我懒得写。awa

D题,其实巨简单。。简单的有点无聊。
题目给的限制太严格了。其实每次能够调整的只有中间的一个部分和尾部。
\(x\)表示字符串尾部相同的字符数量。
\(x=k\)的时候,前面的部分可以截取一个长度为\(2k\)连续相同的串的中间。或者这个串本身就是完美的。
\(x<k\)的时候,需要找到前面的一个连续相同,并且字符和这个相同的位置,且长度为\(k-x\)或者\(2k-x\),截取过来。
\(x>k\)的时候,无解了。

总体就3种情况。这题。。恶心归恶心,但是不得不说确实很考验分类讨论的能力,和代码的思路构建。如果不是按照这个办法构建思路,可能会代码写的很恶心。

唉。要是写的快,能rank100 。然后我rank1000 。难绷。

5题确实是一个大瓶颈啊。

E题,很有意思。

赛时没时间写了,考虑了一下。主要还是赛后想的。
曼哈顿距离相同,是在一个竖着的正方形上的。这个正方形的边长是\(d+1\)
然后先钦定一个点在三角形上,另一个点也必须在他的矩形上。
画出这两个矩形的交点。发现只有两个点!😋

但是又什么用呢?\(O(n^2)\)不说,要什么样快速判断那两个点是否存在呢?
其实可以做,先把每个点按照\(x+y\)排序,然后第二关键字\(x\)排序,这样就可以两次二分查找到是否存在了。
但是\(O(n^2)\)还是无法接受。
发现其实这个n方里面有大量的冗余的枚举。观察我们花的那两个正方形,发现其实这个曼哈顿三角形里面必定有两个点是在一条斜率为\(+1\)或者\(-1\)的直线上的。那我们就先枚举这两个点之一的点,然后直接计算出另一个点。这样还有一个点,再观察一下那两个正方形,发现如果确定了这两个点,另一个点就必定再一个斜率为\(+1\)或者\(-1\)的线段上,而我们要做的就是二分查找这个的存在性。还是一样的,按照\(x+y\)第一关键字,\(x\)第二关键字排序。就可以二分找到了。总体\(O(nlogn)\)

posted @ 2024-06-08 14:17  HL_ZZP  阅读(18)  评论(0编辑  收藏  举报