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\) 的操作就行了。感觉结构很好,做法很优美。

黄队太强了。

2025/11/19NOIP模拟赛(20251117)

时间没写错,提前验题。

  • [A 下一个天亮] 二进制构造
  • [B 希巴拉克的道路] 最短路、凸包或李超线段树
  • [C 超纲] 斐波那契数列、线段树合并
  • *[D 又是 998] 优先队列的计数 DP

\(100+100+100+0=300\)。题目好无聊,3+1 模拟赛。这个第四题有关的优先队列 DP 至今不懂,之前有个正睿搬的题也是优先队列 DP,这个可能要重点看一下。

对优先队列的操作 DP,先明确问题:有一个操作序列,操作形如往堆中放入某个数或者删除最小值。反向操作,加入数字时就决定它最后有没有被删除。DP 状态记录:前 \(i\) 次操作已考虑,后面要弹掉 \(k\) 个元素,这 \(k\) 个元素的最大值为 \(x\)(如果 \(k=0\)\(x=0\)),不被弹掉的元素的最小值为 \(y\)。加入数时,枚举它被弹掉还是保留,注意要保持 \(x\leq y\)。删除最小值时,使 \(k\) 减去一,如果这样会使 \(k=0\),则相应修改 \(x=0\)(这就是为什么要记两个数)。优化是把 \(x, y\) 用一个数记录(因为 \(x\leq y\)),例如记成 \(r\),在 \(k=0\) 的时候直接钦定 \(r\) 表示最终 \(\leq r\) 的数会被弹出。由于需要去重,这里状态需要分为 \(<r\)\(\leq r\) 两种,以防相同的 \(=r\) 的值被算乱。这题可以前缀和优化,最后可以过。

2025/11/18NOIP模拟赛(20251118)

  • [A box] 高维 DP
  • [B graph / P5191,P5954] 需要想一下的 bitset 优化 DAG 可达性相关问题
  • [C chess / CF1586I] 逆天构造
  • *[D permu / CF1672I] 逆天数据结构维护贪心,维护前缀最小值序列

\(100+100+100+20=320\)

第三题竟然想出来了,我真牛。第四题不会贪心,感觉对这个问题的结构一无所知,根本做不出来啊。

25noip赠送赛day3之不唱搁浅(20251119)

  • [A 水仙花] 小容斥
  • [B 勿忘我] 增量构造,难点在想到增量构造
  • [C 君子兰 / qoj4228] 比较神奇的 DP,难点在状态设计。这里要求出一个数组的第 \(k\) 项,则直接将 \(k\) 计入状态,这样方便对最终数组形状进行修剪以转移。
  • [D 郁金香] 经典题懒得找原题了

\(100+100+60+100=360\)。第二题这个构造很久都没想到增量构造,浪费好多时间。

2025/11/21NOIP模拟赛(20251121)

  • [A 木叶创立 / gym105141K] 点边容斥
  • [B 须佐能乎 / gym103811F] 树的直径和最远点,矩阵快速幂,自然根号
  • *[C 秽土转生 / gym103855L] 启发式分裂
  • *[D 忍界大战 / qoj4878] 二分图匹配、动态维护 Hall 定理

\(100+100+25(45)+35=260(280)\)。不是,这都啥啊题目啊,从哪开始做啊。

2025/11/22NOIP模拟赛(20251122)

  • [A 破乱的诗歌] 回文、区间重排,不太简单的贪心
  • [B 增殖的病菌] 有向图强连通分量,分类讨论
  • [C 可爱的猫猫] 暴力,搜索,搜索剪枝,以及逆天复杂度证明
  • [D 美味的蛋糕] 二分贪心

\(100+100+40+90(100)=330(340)\)。第三题不会啊,真的不会啊,这从什么地方开始做啊。第四题的做法太复杂了,这个是纯的贪心,直接贪心就对了,不需要背包,我是真逆天。

  • n 个物品,第 i 个物品的重量为 \(a_i\),价值为 1,装入容积为 m 的背包中,问最大价值和。
  • 直接贪心就是对的。反证法就行了。

2025/11/25NOIP模拟赛(20251125)

  • [A 网络延迟 / CF1919D] 分类讨论、最值相关的问题、模拟
  • *[B 帝国 / CF1181E2] 平面矩形题,切割、链表维护,贪心、暴力模拟
  • [C 平衡 / CF1211H] 二分、树形 DP、背包、树形背包复杂度分析
  • *[D 磁盘整理 / CF1804H] 优化状态数的 DP

\(100+50(40)+100+40=290(280)\)。联测太难了,无言了。第四题见过,但是不知道怎么优化空间(也可能是太困了想不动),最后没写。现在再看一下,其实这个空间优化很简单,其中一维放到外层枚举就行了。

这个第二题我好笨啊,因为 \(O(n^2)\) 太难写所以没写,但其实应该写一下的,这个 \(O(n^2)\) 通向正解了,我在别的做法上浪费太多时间了!就是直接启发式分裂,按照四个维度分别分裂取最小值,很简单(但是写起来很难受,不写了)。

2025/11/26NOIP模拟赛(20251126)

  • [A 创生法阵] 构造,二次剩余,随机化
  • [B 都因为你] 简单题,抽屉原理
  • *[C 地脉流路] 环空间,线性基;边权为 \(a_u\oplus a_v\oplus C\) 的最小生成树,采用压缩 Trie 降低复杂度。
  • *[D 终末之语] 字符串,字符串的同构(两个字符串同构当且仅当存在双射使得两个字符串相等),分治或《优秀的拆分》,或者将同构进行映射

\(100+100+64+14=278\)

第一题跳了之后一直不会,后面做出关键转化之后忘了能随机化了,紧急学习 Cipolla 求二次剩余,最后结果就是这个题严重影响整场比赛的节奏。当然不影响出题人傻逼啊。

第二题出题人傻逼,竟然敢把它放第二题的位置。

第三题把图拆成树之后,就变成一个类似于 Xor-MST 的问题:边权为 \(a_u\oplus a_v\oplus C\) 的最小生成树。想了一下,发现不会低于 2log 的做法(因为 1log 做法依赖了压缩 Trie 树,不会做可以谅解),想了一下决定写这一堆 2log 做法里面的 Boruvka,顺利过了所有大样例。这时候想了一下要不要拼包,可以拼,但是还有个 T1 没做,回去做 T1,最后搞完没时间拼包了。1log 做法就是把 Trie 树压缩一下,顺便改一下算法以适配它(看上去就是放弃别的算法写爆搜递归。好吧还是要想一下的,就是一个递归函数处理最小异或对,直接暴力递归都对,然后另一个递归函数调用它和自己)。感觉,反正压缩 Trie 都不可能考,那我不管了。CF888G 这个原始题目也同理,不用压缩 Trie 就是 2log,用了就优化到 1log。

第四题不会,只会把同构改成“每个字符前面和它相同的字符之间的距离全部相等”,后面没想。题解说这个同构关系可以套到 KMP 和 Z 函数上,然后可以分治,也有人说可以用《优秀的拆分》这个题的做法做,具体怎么搞不知道。具体看了一下,这里是有两种做法。

  1. 证明了 KMP 和 Z 函数可以使用这个同构的定义。然后分治暴力计算。看上去就是暴算,我不想管细节了。合并两个字符串的同构关系时要判断是否冲突,需要额外 \(O(m)\) 的代价消除,所以复杂度是 \(O(nm\log n)\)
  2. 我们尝试定义一个串 \(s\) 的唯一的同构编码 \(\bar s\):记 \(prev_i\) 表示 \(i\) 之前的字符等于 \(s_i\) ​ 的位置中,最靠后的位置,没有则为 \(i\)。发现我们只要让 \(\bar s_i=i−prev_i\) ​ 就可以构建出同构编码。不难发现,两个字符串同构,当且仅当它们的同构编码相同。用主席树维护同构编码的哈希值,这样可以求出一段后缀的前缀的同构编码。对所有后缀进行排序(3log,排序+二分+主席树查询),求出字典序相邻两个后缀的同构编码的 LCP,转化为一个序列分治问题,建笛卡尔树做启发式合并(2log)。优化是有一种神秘的后缀排序方法,具体不写了,可以做到 2log,所以复杂度是 \(O(n\log^2n)\)(不依赖字符集)。

2025/11/27NOIP模拟赛(20251127)

  • [A 幸运数字 / P10026] 构造,分讨,二进制
  • [B 季风 / CF1332E] 奇偶分讨,数学计算
  • [C 树的遍历] 傻逼拆系数题
  • *[D 消消乐 / QOJ10206] \(\pm1\) 序列前缀和,最小前缀和,DP,计数,找结论,倒序 DP

\(46(100)+100+35(100)+18=199(318)\)。喜报,挂了两个题。

第一题,有点低估难度了,做的时候就是直接分讨,漏情况了。我看到有人是直接枚举 \(\times 2\) 的次数然后算的,这个做法确实好,也应该想这个,去分讨就输麻了。还看到有人是打表发现这个情况的,这个额也确实是可以这么干的。另外,搬题人你妈死了,怎么发的样例又弱又小的。

第二题,诈骗题,差点被骗了,随便写东西就过了。然后忘了 \([x^0](F(x)\bmod (x^2-1))=(F(1)+F(-1))/2\) 这个事情,写了矩阵快速幂。不过也无所谓啦。搬题人你妈死了,怎么发的样例刚好是特殊性质?

第三题,没有找到原题,那就是原创的?出题人,你妈死了。懒得喷。就是 \((A+B)(C+D)=AC+AD+BC+BD\) 一直拆拆拆就是了。

第四题,就是要找到这个判定的结论。没这么难找。就是先判掉两边的最小前缀和都 \(\geq 0\) 的情况,然后考虑有一边的最小前缀和是 \(-x\),然后就可以推出来另一边的前 \(x\) 个数都是 \(+1\)。然后就可以进一步知道,另一边剩下的部分最小前缀和 \(\geq 0\)。同时还有一个条件是一边的总和 \(+\) 另一边的最小前缀和 \(\geq 0\)。没有人有文字题解,大概是对的吧。然后枚举 \(x\),进行对最小前缀和的 DP,这个大家都知道可以倒着 DP,然后好像就做完了啊。不写了。

你以为第四题搬题人我就不骂了吗?第四题搬题人你妈死了。

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