2025省选训练总结
2025省选训练总结
2025-02-13
第一天训练总是令人恶心,虽然说并不困。
看完题感觉都很恶心,随便蹭了一点分就去写我的矩阵树定理了。
T1 是计数,应该是用某种方式 DP。
T2 是树上博弈论,感觉要分讨很多情况。
T3 是最优化问题,可能要用一些特殊的性质。
总结
- 今天的题有些偏难,没有什么好写的部分分。
- 现在我需要做的事情还有很多,不仅是做当天的比赛,还有一大堆的知识点需要补,另外就是改之前比赛里的题。
T1
考虑用总数减去不合法的方案数,考虑一个这样的过程:初始
设
时间复杂度
2025-02-14
今天把时间用满了,可惜分不算特别高。
今天题目难度倒序,我也是倒序开题。
前面想了很长时间的 T1 但没有哪一档分时好拿的。
看到 T3 感觉更好得到一些部分分于是先开 T3。首先套一个 KMP 的模版求 border 可以获得 30pts。然后加上 map
里查询,然而我发现我不会容斥。决定先做别的题,此时比赛过去了三分之一。
然后去开 T2,再看一遍题目终于看懂了题意,维护根到最远叶子的距离
尝试再看 T1,最后修修改改只拿到了暴力档的 5pts。
最后得分
总结
- 今天题目难度倒序,非常考验选手的心态和观察能力。
- T3 或许多花一些时间想一想如何容斥可能就能过,T1 花的时间还是太多了。
- T1 没有获得很多人都获得的 25pts,这类题目可能不擅长。
- T2 正解就是点分树,不过再那之前要经过一些转换,用 1h 写点分树获得 20pts 可能不是非常好的战略。
T2
题面。
码量很大的树题。
如果确定了根,一个点的 SG 值就是它到它子树内节点的最远距离。这样可以写出
考虑一个点的 SG 值只可能是整颗树上距离它的最大值或次大值。考虑处理出直径和直径中点,最大值就是经过直径中点到达一个直径端点。
由于一个点不能往它到当前根的子树方向走,所以我们能发现,取最大值的点恰好是从根到直径中点路径上的点,而其他点则取次大值。
考虑先用点分树计算邻域内次大值的异或和,接下来计算从根到直径中点这条路径上经过邻域的点的最大值和次大值的异或总和。
我们可以以直径中点
然后使用树状数组计算路径异或和,可以差分子树修改,单点查。
对于直径中点有两个的情况,可以在开始时往每条边上插一个点,最大值和次大值除以
时间复杂度
T3
考虑到随机数据时 border
不会很长,我们从后往前枚举左端点,每次枚举长度小于等于
考虑到如果右端点相同的子串 border
,所以我们插入贡献时容斥,插入
使用字典树或哈希表记录贡献。时间复杂度
2025-02-15
今天做杂题。
2025-02-17
T1 是 DP,T2 是数论,T3 较难。
首先思考 T1,想到了可以设
然后
经过一些乱搞发现每次答案都与大样例差个位数。
然后去看 T2,感觉是很套路的莫比乌斯函数,经过一些推式子得到了一个
T3 不会,于是直接取相邻两项的最大值,甚至暴力也没有写就获得了 24pts。
最后得分
总结
- 今天时间没有用满,T3 暴力没写,T1 没有继续思考。
T1
赛后经过自己的思考想到了怎么加入一个点的贡献,再加上题解的优化成功过掉了。
我们先反过来设,这样是取
我们可以先求出小偷行走的路径,把原树剖成了很多条链,那么我们在叶子计算整条链的贡献,即对于叶子
合并即
这样就能过掉
考虑优化,由于有用的 DP 数组值域为子树内
T2
再次写一下赛时推出的式子。
根据题意,就是多测
推式子:
枚举
设
那么离线后,按
2025-02-18
今天打满了,但比赛时有一些正确的想法没能继续深入。
首先看到 T1 是计数,T2 是
首先开 T1,先想到了
然后尝试写
考虑优化,注意到区间不交,可以把区间按照包含关系变成树的形式,注意到一个区间的总长大于它的儿子总长之和,于是想到了树上背包的复杂度,我们建出树,利用树上背包转移,
此时过去了一个半小时。
然后火速开 T2,一眼 DP,写出了一个
想了很久,此时又过去了一个半小时,只剩最后一个半小时。
赶快开 T3,经过一番思考想到了维护对于每种颜色
最后得分
总结
- 今天的节奏还可以,T1 做的比较快,但可惜在后两题没有得到高档部分分。
- T2 想得不够深入,想容斥时一定要用式子表示,不然光靠心算是很难算出来的。
T2
设
考虑 A 性质,
就是对长为
具体来说,考虑两个数
回到原问题上来,复杂度就是
接下来考虑有长度为
对于
记
类似上面的做法:
如果求出
先看后半部分,枚举
2025-02-19
今天做杂题,是 lxl 讲数据结构,然而与一道 Ynoi 大战了一天,拼尽全力无法战胜。
2025-02-20
今天按照正式比赛的节奏来,没有浪费时间。
T1 想到了每个点都可以表示成一个单位运输量与时间相关的折线函数,那么折线函数的点数是
然而我的实现好像比较劣,由于排序所以多带了一个
我写完 T1 并交上去用了一个半小时。
T2 首先把暴力写了,然后想到了
T3 我试图贪心,然而有多测,map
套上 vector
即可。最后十五分钟时交了上去。事实上我的贪心可以过掉
最后十五分钟还是把 T2 的 8pts 写了,依然用 map
和 vector
快速实现。
最终得分
总结
- 最后两题的暴力拿得还不错,但是 T1 写的自以为的正解常数过大,要尽可能优化自己的常数,特别是写的正解,多优化一些常数就有可能得到更高的分数。
- 不要认为
可以过掉 ,出题人不会留手。 - 最后一题的贪心花了过长的时间,导致最后补分时比较赶时间,当贪心错了时就应该尝试其他方法。
T1
把 std::sort
换成每次与儿子进行归并排序就不会 TLE 了,然而一直 RE 95pts,调了半个小时终于找到了问题,死因是没有开 long long
。
T2
性质 1:如果某次倒水往左边的杯子倒,则之后的杯子都是空的,之后的操作没有意义。
性质 2:记
- 当
为空时,显然。 - 当
不为空时,首先有 ,则 的水一定是 之前倒出的水的一部分。
因此可以设状态
我们可以在
于是转移分两种,往左边倒,和往右边倒。时间复杂度
2025-2-21
今天的题对我来说有点难了,但是感觉 T2 并不比 T1 难,所以说不要因为 T1 不会做而浮躁。
首先看 T1,把路径数和边数和分开求,先写了
然后我接着试图再优化,期间想了把它变成二维状态然后观察它的转移,看能不能上线段树之类的,然而发现不可做。这里就等于浪费了一个小时。
最后我把
然后看 T2,T2 是交互题,感觉这个询问很神秘,与值域相关的复杂度是不行的,我并没有想到怎么做,于是写了 15pts 的暴力就走人了。交完 T2 还剩一个半小时。
T3 发现有一个 44pts 的部分分很好拿,就是先
然而发现大样例过不了,此时还剩四十分钟,最终排查出是取模写错了,这个错误我之前已经犯过一次了,以后要多加注意。
void inc(int &x,int y) { x+=y; if(x>=mod) x-=mod; // 写成了 if(x>=mod) x-=y; }
T3 还有一个 8pts 的档,是除了第
最终得分
总结
- 今天尽力了,只能说没有意外。
- 虽然说时间用得比较平均,但是 T1 还是花了较多时间在没有用的思考上了。
T1
考虑容斥,枚举
题解的式子看看就好,具体来说也是很难推的。最后可以得到一个
考虑阈值分治,对于
T2
如果想到了对值域讨论就很好做了。由于与值域有关的复杂度做不了,考虑对值域讨论一下。
首先所谓的能耗就是最大权独立集,有 DP 式子
我们先分析能耗可能达到的上下界,当
考虑增量,当其中一个
那么我们可以初始让
那么对于一个询问
当
询问只需二分出
现在的问题是如何求出
最后的时间复杂度是
2025-02-25
我的心彻底碎掉了。
今天的模拟赛明明已经用满时间了,但是就是没有拿到该拿到的分,果然还是不擅长吗?
T1 是区间内求点对的最值,点对的贡献是 LCP 乘 LCS,我想到了或许可以用支配点对的做法,离线下来然后变成二维数点问题,那么怎么做支配点对才能让点数尽可能少呢???我想不到,想了四十五分钟了。
那么就首先写一个
挣扎到一个半小时时,我不再想了,试图在后面的题多拿一些分。
看到 T2,我一直不理解题意,所谓的「端点两两不交」是什么意思?其实出题人就是傻逼,「包含」都能写成「包涵」。但还好过了半个小时用我的暴力验证了题意,我的暴力反反复复修改了好几次。
然后我想更优的做法,题目要求是「所有路径的交至少包含一条边」,注意到若干路径的交一定是路径,所以可以枚举路径的交,然后容斥计算答案,贡献为
这个 DP 好像很难做,想了想复杂度大概可以做到
我不再写 T2 了,觉得写不完或者写了也不会有太多分,但又不舍。最终去开 T3。
经过一番对题意的理解,写了一个
最后得分:40+15+12=67,败在了第一题没有高分,第二和第三题没有把部分分写满。
总结
- 今天 T1 想到了是支配点对,但还是没有做出来,而 T2 的 DP+容斥 做法细节比较多,我几乎花了一个半小时在这上面,但没有做出来,T3 的题意稍复杂,暴力写完后没有写出小规模的 DP。
- 我的问题可能在于代码能力不够,再然后可以归结为做的题不够。
- 今天属于是每道题都有一些好的思路,但是都没能继续深入以及实现。
T1
很妙的解法。赛时只能说想到了一半。
考虑怎么做支配对:我们对于
考虑把正串插入字典树,那么对于一个节点,其子树内所有串的 LCP 至少是当前点的深度
可以对子树内的串,对它们的反串建字典树
可以考虑在正串的字典树上自底向上启发式合并每个点的 set
维护编号集即可。时间复杂度
最后对
T3
很难想到的转化。把普通
2025-02-26
今天是省选前最后一场模拟赛,拿到了应拿到的分数,不过后半程稍微有些乏力。
今天大体的策略就是先把每道题的暴力快速写完,然后再想更高的分数,发现这样可以拿到应拿的分数,而且避免了前半程思维固式与犯困的问题。
看到 T1 是跟「矩阵的秩」有关,似乎不是很擅长,T3 则是计数,而 T2 是数据结构,所以先开了 T2。
首先第一档直接开一个 vector
记录历史即可,回溯历史就二分位置。此时获得了 36pts。
然后去做 T1,先
然后去写 T3,看到
接下来就是补分,T1 放在 T1 一定有它的道理。考虑链的性质,我先把链的秩打表,发现
然后我想去写 T2 的更多分,但发现有些难写,而 T3 就更想不到了,最后一个小时的时候,我才会了 T2 的第二档用可持久化线段树模拟的档,然而最终没写出来,有一个 vector
不知道为什么只要 push_back
就会 RE。
最终得分
总结
- 今天的节奏掌握的不错,前面用了一半时间写暴力,后面时间冲更高分,这样可以防止最终没有获得该拿的分数遗憾离场的情况。
- 但也有一些问题,开始 T2 写得比较慢,花了一个半小时才获得了 36pts,并且后面的一个半小时没有获得任何分数。
T1
可惜的是,正解与链的结论是一样的,就是把树剖成点数小于等于
T2
正解是
赛时就想到了如何做第二档,查询与区间加都是常规操作,可以标记永久化。考虑区间历史回溯:
- 对于修改
,若当前区间 是 的子区间,将历史区间复制为当前区间,并加上路径上的历史标记。 - 若当前区间与
不交,将上次修改后的区间复制为当前区间,并加上路径上总的标记。
于是每次新建一个没有标记的节点,下传时分别加上历史标记与总的标记,回溯时需要合并子节点的和。
这个做法是时间与空间都为
T3
原来
正解是考虑一个经典 Trick,枚举
那么现在每个点有
这是一个树上背包问题,确定
考虑将所有
上述过程中,需要先枚举
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下