省流
\(59min\) 开出 \(4t\),压线绝杀 E 拿到表现分 \(2117\)。
10.3
内含剧透,请vp后再来。
不是题解!!!!!!!
赛前
国庆之后几天的效率极其低下,只补了三道区域赛的题,这次就没什么压力坦然面对了,赛前一个小时都在划水,心态很放松。
赛时
一打开就要人机验证,不过因为心态还好没有急躁。A 题给了一个初始全零的数组,每次操作可以对整体加任意值或把某些位置变成 \(0\),问最少要多少次才能把初始数组变成给定的数组。一开始以为每次操作只是能加一,就想着是加到最大值减这个值的时候变成零就可以,于是就用 \(set\) 存,然后因为最大值不用删消耗的次数就是最大值 + \(s.size() - 1\),发现不对。重新读题发现可以直接加任意数,那就还是这个思路,不过总共要加的次数也变成了 \(s.size()\),在 \(3min\) 时一发通过。
B 题给了两个人的位置和一个矩形,两个人都要在矩形里跑,第一个人只能上下左右走,第二个人可以斜着走,每次都是一格。之前做过类似的追赶的题目,很容易想到一定是把第一个人往墙壁上赶,那么情况就可以分成四种第二个人在第一个人的不同象限,以及在以第一个人为原点的坐标轴上。在坐标轴上就是直接把第一个人赶到相应的边上就抓到了,如果不在坐标轴上无论怎么追第二个人总会在某个时刻变成第一种情况,那么第一个人只要先往距离相应边较大的那个第二个人的位置凑就行了,可以转换成第一种情况。所以最后答案就是第二个人相反的象限的边离得较远的那个距离。\(16min\) 通过。
交完后看到 \(flyfreemrn\) 在 \(15min\) 先开 C 就通过了,所以应该也不是难题,抱着这样的心态看 C。C 题给了一个零一串,每次可以删掉三个相同的数,然后把剩下的串按原顺序拼接在一起,这个删除的花费就是离得较近的两个数直接的距离。要求在 \(O(logn)\) 的时间复杂度内求出把这个串删光的花费。发现如果有形如 \(00\) 或 \(11\) 这样的,删除花费就是 \(1\),而且在删掉另一个相同数之后总能构造出新的 \(00\) 或 \(11\) 串,所以总花费就是长度除以三。那么就是只有出现整个串都是交替串时才会让总花费加一。考虑查询是否是交替串,只要在一开始 \(O(n)\) 的维护好所有交替串的起始点和终止点,然后二分查找到这个查询的一端所在的交替串,再比较另一端是否仍在这个交替串内即可。\(37min\) 通过此题。
D 题给了一个数组,依次进行对某个大于等于二的数除二或加一,除二希望次数少,加一希望次数多,问在这种情况下除二多少次后整个数组变成零。容易发现如果没有加一那么 \(2^n\) 前后会发生除二次数的变化,那么 \(2^n-1\) 就是双方需要抢夺的地方,让加一抢到的话除二的次数就会多一次。直接写完后发现样例并不能通过,例如 \(6\) 看似不用抢夺,但除二后变成 \(3\) 就需要抢夺了。发现除了 \(2^n+1\) 之外别的数抢不抢最终都会变成可以被加一拿到,但 \(2^n+1\) 如果先除二那么加一就没用了,所以只用抢这一种情况,别的就是答案就是大于等于这个数的二的次幂。\(59min\) 通过。
E 题是交互题,有一个一个长度为 \(n * n + 1\) 的数组,可以询问 \(n\) 次,每次会把询问的下标中输出摩天大楼值,就是一个单调栈最后保存下来的下标。要求输出一个长度为 \(n+1\) 的上升或下降子序列。显然可以想到每次问全部,然后再问剩下的,直到问 \(n\) 次,可以把整个数组分成很多个块,然后进行 \(dp\) 就行。注意到后询问的一组数中一定有某个比前一组的某个小,然后每个转移直到最前面一次询问就行。注意转移开始时是从最后也没被问到的数开始。一开始写的时候正向也转移了导致了错误,出现 TLE,花了很长时间去把拷贝路径改成了指针,但还是 TLE,最后果断删掉就过了。在 \(177min\) 以三发罚时通过这一题。
赛后
这场打出了 \(2100\) 的表现分其实有点侥幸,因为最后一直 TLE,没有遇到 \(-1\) 直接退出,基本没什么查的头绪了。现在和大家仍旧有很大差距,需要重视,继续努力坚持下去稳定在这个表现才可以追上别人。以及在写这个游记的时候成都站的外卡发下来了,非常好用,但是距离实战也更加短了,还是要继续努力的。
2025年10月4日