Codeforces Round 983 (Div. 2)

Dashboard - Codeforces Round 983 (Div. 2) - Codeforces.

2025.1.21 上午和大家一起打,3.5h(?)。

2025.1.21 上午听 XK 讲题,下午看题解、讨论、补题,晚上补题、写题解。

赛时 AC ABCD,CD 耗时长。题已补完。


稀疏矩阵高斯消元。

仙人掌 DP(的一种?)(每个子树 [最多只有](?)一条连到子树外的返祖边,把子树外那个点的 DP 值设出来,带进来表示其他 DP 值,推上去到那个点时解方程)。CF Div1 [E](?).


下标为 -1 不一定 RE。(?)

不要少打空格。


A

值不同的两个开关点亮一盏灯。

统计一下 0,1 分别的个数。

  • 最小:把 0 放一起、1 放一起,如果有剩下的再合一起;2n 是偶数,0,1 数量奇偶性相同,直接判。
  • 最大:把 01 尽量拼一起,点亮的灯的数量就是 0,1 个数的 min

B

感觉有点诈骗。

k 单独放一段。n 是奇数,所以左右两边元素个数奇偶性相同。

  • 如果左右两边元素个数都是奇数,直接把左右两边各作为一段。
  • 如果左右两边元素个数都是偶数,让左右两段各分出一个数单独作为一段,共五段。
    • 如果左边不足 2 个元素或右边不足 2 个(那就是 0 个了)(包含左边无或右边无的情况,其实就是这些情况),则无解。
    • 但需要特判 n=1,即左右都无。
    • 所以其实是左右一边有一边无是无解的充要条件。(?)

C

对“任意”的限制,找极限情况。发现是 最小+次小(数值可以等于最小)> 最大。

思路 1):枚举最小值,把小于它的都改成它,得到最大值的上限,把大于上限的都改成这个上限。但是 有错,因为事实上可以通过更改次小值而不是最大值来满足限制。例:1 1 2 2,可以把一个 1 改成 2

思路 2:枚举最小值可能会改次小值,于是我们枚举最大值。把更大的都改成枚举到的最大值,把最少的数(从小到大)改成最大值,使得改之后的最小值和次小值之和大于这个最大值。不用真改,排序后二分实现(两步都是二分),时间复杂度 O(nlogn)。应该也可以双指针,但仍要排序(应该仍要带个 log)。

D

询问其实可以用来看两个结点是否是父子关系(不是所有情况都可以)。

思路 1(我赛时用的):从小到大添加,先找 1 所连的,枚举 2,3,,n2n1 是最后一个,1 必须连下去,那么如果前面都不行就是 n1 了),和 1 询问,第一个不经过 0 的是和 1 连的,前面的都和 0 连,这部分最多用了 n3 次询问。接下来对剩余的结点,考虑所有链底(所有能接的结点),从小到大枚举,这样枚举过的就再也不会被用到了(分 用不用 讨论)(也需要添加新的链底点);尝试作为父亲(尝试作为父亲时被拿去询问)的点最多时的编号是 2,3,,n2n1 不能作父亲结点),于是这部分的询问次数不超过 n3(应该能达到),这部分用队列实现。那么总询问次数不超过 2n6(不知道能不能达到),符合要求。

思路 2(%%% exCat 和 题解):双指针,一个枚举当前结点,另一个枚举父亲结点,都从大到小扫过去。(???)

另一个观察:最后只有一条那种长的链,因为某种条件下就只能沿着这条链添加了。(???)

n4,不特判。

E

思路 1:差分,操作变为 +1,+1,1,1,把 ci 当作变量,列方程组(n 个方程),高斯消元。注意到全部 ci 都加上一个相同的数仍可,于是减去最小值以变成[最小的非负解](?)(说不定还需要关于整数的处理?我没写。)。

  • 不能直接高斯消元,时间复杂度不行。有两种解决方案:
    • 每行只有四个 ci,且矩阵长得很特殊。把前三个 ci 作为变量,用它们去表示其他的 ci。剩下 [三个](?)方程,用它们来解这前三个 ci。应该要钦定其中一个 ci0
    • 还是高斯消元,但是只用有的消,发现每行要消的行很少,要消的列也很少。(???)

思路 2(在题解区看到的,我用的这个):为了方便取模维护环,把下标变成 0,1,,n1。设 bi=ci+ci+1,从方程中得出 bi 的递推式,令 b0=0,因为 n 是奇数,绕两圈即可递推出所有 bi(令 b0=0 可能是因为推两圈推回去也推不出 b0 为多少),如果推回 b0 发现不等于 0(与原来不同)就无解(后面 c 一定可以解出(?))。由 bc,可以把 c0 作为变量,用它表示其他 ci(记 c0 的系数和加上的常数)。绕回去可以解方程解出 c0,但解方程这里要 /2,注意怎么处理分子是奇数的情况,我是给所有 ci 加上 1/2(在算 c0 时对分子 +1),之后用算出的系数和常数而不是 b(因为 b 已经不适用了,不过硬要用似乎也可以变一变来用,感谢 xjy)得到 c。注意有系数是负数(1)的需要 +1 补回去。也可以重新给 b0 赋初值重新算来处理这种不是整数的情况。最后每个 ci 减去 ci 的最小值变成 [最小非负解](?)。

思路 3:抓住 n 是奇数。拼合操作。我没太懂,见洛谷题解区。

F

博弈,尝试直接推结论,不会。于是直接 DP。肯定是从之后的局面往之前 DP,为了方便翻转原序列,从前往后 DP。每一段规则除了胜负的判定和 Nim 游戏相同(Nim 或 反 Nim)。

fi,0/1 表示处理了前 i 包花生,最后一段以第 i 包结尾,此时先手必败(0)/ 先手必胜(1)的情况数;这里的胜指的是拿走 1i 包中的最后一个花生,即在 1i 包中没有花生拿的那个人输。

siai 的前缀异或和,用它得到区间异或和来判(不止用它)Nim / 反 Nim 先手必胜还是必败。

转移到 fi,0

  • fj,0 + Nim 先手必败(sisj=0,si=sj)。
  • fj,1 + 反 Nim 先手必败(全为 1:奇 ij1(mod2);不全为 1sisj=0,si=sj)。

转移到 fi,1

  • fj,0 + Nim 先手必胜(sisj0,sisj)。
  • fj,1 + 反 Nim 先手必胜(全为 1:偶 ij0(mod2);不全为 1sisj0,sisj)。

转移是加起来。

初值:f0,0=1,f0,1=0

答案:fn,1

这里 表示异或。

各种前缀和。

用 [map] 或 [离散化+桶] 来维护 si 相同的 fi,0 的和( 的用前缀和减去它)。

全为 1 和不全为 1 按一个位置分界。双指针扫分界点。上面的 map 再开一个维护左边的。

取模。减法也要取模。

小心前缀和相减左边下标到 1

注意各种东西的初值。

posted @   huangkxQwQ  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示