2025.11 模拟赛日志

2025.11 模拟赛日志

CSP-S 2025

游记 CSP-S2025 - caijianhong - 博客园

25noip二十连测day13(20251103)

  • [A 相等] 质因数分解
  • [B 匹配] 边匹配模板
  • [C 占卜] 观察结构后直接 DP
  • [D 追忆] 枚举倍数分治,莫队,分块

\(100+100+100+52=352\),第四题写错了一个东西导致少了 \(10\) 分,但是又额外过了一个子任务多了 \(10\) 分,也是逆天数据。

第一题,转化为判断所有数乘积是否是完全平方数。值域小时,可以对每个质因子进行 Xor-Hash,做线性筛,复杂度 \(O(n+V)\)

第二题,转化为给定一张无向图,两条边匹配当且仅当边有公共端点,问是否有完美匹配?这个不要想复杂了,首先连通块内有奇数条边肯定无解。然后是树的情况,树一定有解,从而所有无向图都有解,所以有完美匹配当且仅当每个连通块边数为偶数。

第三题,把向左循环移位看成选择一个数丢到序列的末尾,这样立即就能发现结构,直接 DP。

第四题,不会啊,先写暴力,怎么过不了第二个大样例,然后发现是读错题了(王马瑞!你的题面怎么既比形式化题面少东西,又比形式化题面多东西?这是互文的修辞手法吗?NMSL)。调一下,笑死了,暴力过了八个大样例,大样例唐到极致。前面做第二题做慢了,不够时间,写了个回滚莫队过掉 \(k=1\)\(k\geq 400\),比赛就结束了。

这个第四题,额,它就是,\(k\leq B\) 的部分跑 \(B\) 轮莫队,\(k>B\) 的一起跑莫队。然后也不用回滚,因为是要维护单点 \(\pm1\),区间最小值,这个直接序列分块,每一块内维护 \(cnt_x\) 表示有多少个值为 \(x\),这样修改某个值的时候,观察它新的 \(cnt\),可以知道最小值是否应该发生变动,变动是严格 \(O(1)\) 的。最后平衡出来的复杂度是 \(O(n^{5/3})\),也是逆天。回滚不是写不了,是常数有点大。

25noip二十连测day14(20251104)

  • [A 排序] 反向构造(?),贪心
  • [B 变换] 枚举计算,递推
  • [C 游戏] 博弈,结论题,bitset 优化背包
  • *[D 子串 / CF1292E 加强版] 逆天卡常交互

\(100+100+40(44)+40.18=280.18(284.18)\)

第一题,猜了个刻画最终答案的结论,然后说如果这个答案不合法就输出无解,一测,大样例全过了,不管了。

第二题比第一题好想,直接做就行了啊,连凸包的性质都不需要。

第四题应该是做过了,但是到这里是加强了还是怎么回事?我决定先写第四题,因为第三题看着就不好想。\(k=1\) 的子任务突发奇想就过了(并非突发奇想)。\(k=2\) 想了很久也不太会,没那么简单,写了个劣做法。\(k=3\) 更是不敢想。原题的最后一步是暴搜决策树。我决定先写第三题。

第三题写一个暴搜,怎么直接有 \(44\) 分?结论好像不是很显然,下一档部分分要把结论做出来。决定不做,回去写第四题的暴搜决策树,搜不出来,但是可以手动迭代加深。怎么真的搜出来了?然后研究了一下怎么输出决策方案,研究出来了,决策很少,但是能不能再少一点啊,尝试直接钦定每一步的策略,发现策略成线性的了,逆天。写一下,过不了,为什么?没时间了,倒闭。

所以为什么第四题过不了呢?1. 我搜索的是 \(n=4\) 的,没搜 \(n=5\) 的,虽然是说我原来的代码可以直接过 \(n\geq 5\) 的,但是算错了,以为是 \(n\geq 6\) 才能过。2. 决策没写全,它这个代码的逻辑,当可以直接暴力的时候是直接暴力,但是忘了,也正因如此,看起来决策是线性的,实际上是因为有分支出去之后就被暴力截断了。搞完之后直接就 \(60\) 分通过 \(k\leq 2\) 了,勉强上 \(300\) 分,还是有点唐。这个第四题,害人不浅啊,做了特别久,代码特别乱,乱到自己干了什么都不知道,下次记得封装到 namespace 里面!

第三题的结论出人意料的简单啊。怎么想到这个结论呢?!

25noip二十连测day15(20251105)

  • [A 老板] 合法区间计数,前缀和,哈希表(探测法比拉链法快)
  • [B 牛马] 高维 DP 计数
  • [C 亚军] 组合数学计数
  • *[D 毒瘤] 回文串相关计数,拆分计算类型,调和级数打分界点计算 LCS 和 LCP 进行计数

\(100+80+100+20(10)=300(290)\)

第一题,很快就看出来怎么做,但是卡在 1e7 哈希表上了。最后没写哈希表,而是发现了值域小,写了计数排序,做的时间挺久的。

第二题不会啊!

第三题一眼会了 \(O(n^2)\) 怎么做,就是 LIS 和 LDS 一定在中点相交,然后两边就是独立的。可以直接 DP 两边。优化也很简单,用组合数乘一下跳过任意选的转移,不是任意的转移只有 \(O(1)\) 个地方有新值。

第二题不会啊!想到很多 \(O(n^4)\) 往上的做法。

第四题写了个 \(10\) 分暴力,因为 \(20\) 分太难写了,还不如写第二题的 \(m=0\)。这时可能犯了一个错误就是死磕第二题,一直往一个方向做。好在最后一个小时发现可以把操作倒过来,这样写出来的 \(O(n^3)\) 代码比较简单,获得 \(70\) 分,随手再写掉另外 \(10\) 分,剩下一个卷组合数的瓶颈,不会做。题解是通过修改状态定义和重新确定权值以杀掉这个组合数瓶颈,感觉还是有点神奇的。什么叫修改状态定义呢?就是原本记录哪些点被用过,不含空点;现在记录哪些点被覆盖过,空点会被一起覆盖掉,我们最后再规定 \(f_{0,i}=1\) 就行。然后因为有空点的存在,因此我们的覆盖方案数也要做出相应的调整,幸运的是这只是一个二项式定理,形式很简洁,于是就能回避掉最后“由用过的点转移到总点数”的这个组合数卷积。

第四题好难啊。它处理性质三的时候要用到看起来已经被抛弃的性质二,然后证明了翻转子串的右端点是中点或者右端点右一个字符是中点,于是只有有限种翻转模式。再证明同一种模式的方案是唯一的(运用回文和重复串的定义),以及除了一个特殊情况外一个串只能匹配一种模式。然后用《优秀的拆分》的技巧,调和级数枚举,打分界点,计算相邻分界点之间的 LCS 和 LCP,从而计算在这种模式下的拆分方案数。同时再证明一下拆分方案数是 \(O(1)\) 的。总的来说还是很复杂的,场上也没人过。

25noip二十连测day16(20251106)

  • [A Persistent] 离线操作树解决可持久化
  • [B Mode] 01 分数规划,贪心
  • *[C Tree] 构造,树形图最小链覆盖
  • *[D Sequence] 数位 DP,meet in the middle

\(100+100+20+60=280\)

第一题就是一眼题,就是有点难写。有点蠢,拿线段树维护了,写了好一会。第二题就是先贪心,然后二分、0/1 分数规划,呃,就很显然,然后也没有什么线性做法。第四题见过类似的形式,写完部分分就跑了。第三题不会做。感觉很倒闭。

25noip二十连测day17(20251110)

  • [A 笋与横着] 简单思维题
  • [B 别笑,你也过不了第二关] 诈骗计数题,树形背包,没那么难
  • [C 流逝的时间没能淡去对优秀率的记忆] 贪心,反悔贪心
  • [D 建立起与你之间的桥梁] 找出结构性质,数据结构维护

\(100+100+0+36=236\)(没交)。我要睡觉。

第三题就是一个反悔贪心,按照反悔贪心去理解就没错了。

第四题最后的解法很直观,就是题解写的有点混乱。最终的解法:

  • 定义 \(R_i\) 表示假如答案是 YES,那么 \(\geq i\) 的数作为什么区间出现。如果所有 \(R_i\supseteq R_{i+1}\),那么答案是 YES。如果值 \(y\) 不存在,忽略 \(R_y\),结论仍然正确。
  • 如果值 \(y\) 存在,令 \(a_x=y\),则 \(x\)\(R_y\) 的一个端点,怎么知道是左端点还是右端点呢?如果值 \(n\) 存在,那么 \(y\) 在值 \(n\) 左边,区间就是 \([x,x+n-y]\),否则 \([x-n+y,x]\)。把这些区间全部写出来,判断是否互相包含即可(所有区间按照左端点排序后,观察是否右端点组成的序列不升,注意相同左端点的一些处理)。
  • 如果值 \(n\) 不存在,会麻烦一点。我们只能通过 \(a_x\) 的前驱后继(就是上一个或下一个不为零的位置)来判断它的方向。有四种情况:一种是不合法;两种是单调的,可以确定它的方向;一种是尝试作为全局最大值,如果全局最大值不唯一就是 NO,否则还要做处理,枚举真正的值 \(n\) 在全局最大值哪一边,这样确定全局最大值的区间方向,另外我们可以调整使得值 \(n\) 恰好紧挨着全局最大值,由此值 \(n\) 的区间是不重要的。
  • 注意每次插入删除都要把前驱后继的情况全部改判。复杂度是非常大的 \(O(n\log n)\)

25noip二十连测day18(20251111)

  • [A Little09!] 每日排序题
  • [B 流逝的时间没有淡去我对你的记忆] 区间 DP,但是要想一下记录什么东西
  • [C 你还记得几年前] 优化搜索
  • [D 我第一次见到你的时候] 中位数的有关计数

\(100+100+87+73=360\)。这个第二题做法还和题解不一样。第三题这个搜索感觉很神秘。第四题想到了,但是我以为优先队列 + 树状数组的 \(O(n\log n)\) 过不了 \(2\times 10^6\) 的三秒。感觉就是有一个基准,\(1\times 10^6\) 能过 \(O(n\log n)\) 的一秒,那么数据范围和时限都翻倍也能过。

25noip二十连测day19(20251112)

  • [A 杀蚂蚁] 简单树形贪心
  • [B 子串图] 简单减法计数
  • [C 随机数生成器] 矩阵快速幂,优化矩阵大小
  • [D 分蛋糕] 折半,二维数点

\(100+100+100+48=348\)。这个第四题不会做有点问号了。

第一题一开始想简单了,不过什么事也没有。

第二题想的过程中想到错的地方了,以为很难,不过很快纠正过来了。之后写完代码之后发现过不了样例二,又修复了一下做法就过了。到这里应该是消耗了一小时十分钟,非常快。

第三题跳一下,第四题 48 分暴力非常好写。第三题没想到什么阳间做法,先写了一个关于 \(n\) 线性的暴力。盲猜是线性递推,并决定枚举长度 \(s\) 并高斯消元解出线性递推式。然后是成功了,递推式很短。然后要卡常?观察了一下,发现这个线性递推式的长度是有规律的,这样就不用枚举长度(实际上,也不需要枚举长度,直接倍增确定 \(s\) 更好,复杂度不会多一个 \(s\))。然后构造了一个 \(s=160\) 的测一下,感觉差不多能过。这个时候比赛快结束了。

第四题想随机化看看能不能有希望,写了很久,根本过不去,自闭了。

这个第三题做到最后,复杂度和题解是一样的。就是说正常做法是优化 DP 的状态数,把矩阵快速幂的矩阵大小压下去。具体的方法可以通过看 \(s=\prod_c (cnt[c]+1)\) 猜出来。

第四题竟然是直接的折半搜索和二维偏序。就是钦定一下大小关系就可以合并。欸?怎么没想过这条路线啊?

25noip二十连测day20(20251113)

  • [A 接力] 神秘简洁构造
  • [B 遥远的距离] 诈骗题
  • [C 母鸡卡] 调整法,线性 DP
  • [D 讲不出再见] 线段树分治 + 可撤销并查集,维护

\(100+100+24+55(40)=279(264)\)。坠机啊。第四题 Subtask 5 的数据逆天,完全错的算法都能过。

第一题想了挺久的,后来意识到要打表就打了个表过掉了。

第二题突发奇想把图画出来之后就发现这是个诈骗题。大样例直接过了,没管复杂度,感觉是根号以下。

第四题的暴力写了一下。第三题的暴力写了一下。决定做第四题。经过非常久之后大概知道了它的结构,但是我不会维护。这里主要的问题是我的算法是“点本位”的,所有操作围绕点进行,加点、删点、查询连通块点权最大值、更新点权,这里“更新点权”这个操作让我的线段树分治写出来之后做不出来。题解的做法是“边本位”的,考虑的是往图里面加入边,沿着边进行转移,这样操作就可以撤销,用可撤销并查集。这也像是找出“更新点权”这个操作的影响时间范围,然后拆到线段树分治上去做。

第三题题解做法怎么这么轻松就完成了?感觉战犯。有几个问题是当时没想清楚的。1. 如果两边 1 的个数相等且 \(Y>10^{18}\),那么我们可以直接取出所有 1 的位置,然后匹配。这个过程也有一个等价的想法,就是令 \(f_i\) 表示已经将 \([1,i]\) 位置上的 1 匹配完了,然后转移是找到最大的 \(j<i\) 满足 \((j,i]\) 中两边 1 的数量相等,此时所有 1 的匹配都是一个方向的(否则 \(j\) 不是最大的),这样就可以直接前缀和计算这一段 \(\sum_{k=j+1}^i(a_k-b_k)k\) 的和,取个绝对值就是交换次数。这个做法有利于扩展,包括这道题。这道题就是发现一条匹配不会经过一个取反的位置,否则一定不优,所以做法和刚才的相比加上取反 \(i\) 的操作就行了。感觉结构很好,做法很优美。

黄队太强了。

posted @ 2025-11-08 13:27  caijianhong  阅读(45)  评论(0)    收藏  举报