比赛总结

10.2

题目 异或 游戏 连通块 公交路线
期望得分 \(100\) \(100\) \(28\) \(0\)
实际得分 \(100\) \(0\) \(8\) \(0\)

异或

时间:\(1.5h\)

知识点:差分

赛时思路:

一看到这道题就想到了使用二维差分来做,但是发现三角形不好处理,但推了一下公式发现可以给三角形的直角端点上加上 \(1\),再利用一个一维差分维护减去的值,小样例过了,但大样例过不了。然后发现做了很长时间,然后就写了一个 \(O(nq)\) 的暴力加上一些卡常。

错误原因(改进方法):

其实在暴力的基础上再用两个一维差分就行了,一个维护加上的第一列的值,一个维护斜着减去的值就可以了。

反思:

发现代码错后调试代码也花了很长时间,不仅没做出来,还花费了很长的时间,考试时先要分配好每道题的时间,如果一道题做不出来一定要尽快跳题。

游戏

时间:\(1.5h\)

知识点:\(\text{dfs}\),博弈论

赛时思路:

直接 \(\text{dfs}\) 模拟两个人的博弈,然后每次取对这个人有益的答案然后回溯,然后发现其实复杂度很大。但只需要自己推一下,就可以发现当 \(n\times q\ge10^8\) 时,答案一定为 \(0\),并且当仅剩下一个数的时候可以直接返回这个数,所以这道题就可以过了。

错误原因(改进方法):

考试时我以为每一个状态会多次查询,所以用了 unordered_map,但忘记了 c++\(\text{pair}\) 是没有处理哈希冲突的函数的,所以就报了编译错误。删掉 \(\text{map}\) 不加优化其实也可以过。

反思

考试时写完代码后(或者修改代码后)一定要记得再次编译一下,确保不会犯这种低级错误。

连通块

时间:\(1h\)

知识点:割点,质因数

赛时思路:

我一开始想到了先建好所有的边,然后对于每一个连通块,如果没有割点,则答案为这个连通块的数量减去 \(1\);如果有割点,则答案为删去这个点后分成的若干连通块的最大数量。但是由于没有很多时间了,所以我直接用了埃氏筛,暴力 \(O(n^3)\)

错误原因(改进方法):

首先我们可以观察到如果两个数的 \(\text{gcd}\) 为合数,则他们一定可以同时被一个相同的合数整除,而一个合数至少有两个质数,所以我们可以通过两个质数的乘积将两个点相连,这样建边的复杂度就降低了,则道题也就通过 \(O(n\log^2 V)\)\(V\)\(a_i\) 的值域)的复杂度过了。

反思

赛时挂分的主要原因是给每个数组都开了 long long 导致空间炸了,这道题其实不需要开 long long,以后每道题可以先看题面尽量不要每个变量(或数组)都开 long long

公交路线

时间:\(0\)

知识点:树链剖分,容斥,\(\text{LCA}\),树形 \(\text{dp}\),换根 \(\text{dp}\)

赛时思路:

没有看这道题。

错误原因(改进方法):

首先可以把每个工厂按照编号分组,然后对这棵树跑两次 \(\text{dfs}\) 计算深度、父节点、子树大小、重链等信息,便于后续 \(\text{LCA}\) 计算。然后我们可以在这个虚树上通过 \(\text{dp}\) 求在 \(x\) 的子树中选择两个同色节点的方案数和在 \(x\) 的子树内选一个同色节点,子树外选一个同色节点的方案数。然后经行一遍换根 \(\text{dp}\) 求出每个节点作为根节点的答案。然后我们就可以通过容斥和 \(\text{LCA}\) 求出每个节点的答案了,总方案数就是每个节点的方案数的总和除以 \(4\),所以这道题就做完了。

反思:

后续做题时如果时间较为充裕,所以可以先把所有题目浏览一遍,每道题要尽可能的多拿分,不要死磕一道题,导致后续的暴力分没拿到。

10.4

题目 小鸡 小 L 过河 黑哥的序列 我比你高 2
期望得分 \(100\) \(100\) \(100\) \(32\)
实际得分 \(100\) \(100\) \(100\) \(32\)

小鸡

时间:\(30min\)

知识点:逆序对

赛时思路:

我们可以发现把三个数调换了顺序后,逆序对的奇偶性是不变的,所以我们只要求出逆序对数量的奇偶性即可。我考试时啥也没有像,就直接打了一个线段树,这样复杂度可以做到 \(O(n\log n)\)

错误原因(改进方法):

我们其实可以用归并排序来简化代码的长度,减少打代码的时间。

反思:

考试时尽可能使用一些时间短或代码量较短的代码,不要只用一些复杂的算法。

小 L 过河

时间:\(1.5h\)

知识点:进制转化

赛时思路:

首先我们可以根据题目描述写出移动的过程:

\[x_2(\cdots x_2(x_2(1+k_0x_1)+k_1x_1)+\cdots)+k_mx_1 \]

所以可以简化得到:

\[x_2^m+x_1\sum_{i=0}^mk_ix_2^i \]

所以我们需要减小 \(\sum_{i=0}^m\) 的值,所以用一个类似进制转化的算法就可以过了。

错误原因(改进方法):

考试时以为是要超过 \(n\) 就行了,所以移动过程变成了 \((1+x_1a)x_2^b\) 所以可以用 \(O(\logn)\) 的复杂度实现出来,小样例过了,但大样例错了,然后检查了很长的时间才检查出来。

反思:

考试时要看清楚题目。

黑哥的序列

时间:\(1.5h\)

知识点:\(\text{dp}\),线段树,斜率

赛时思路:

我们最先可以想到 \(\text{dp}\),并列出以下转移式:

\[f_i=max_{1<j\le i}\{f_{j-1}+(a_i-a_j)^2\} \]

所以我们接着发现 \(f_{j-1}+(a_i-a_j)^2=-2a_ia_j+f_{j-1}+a_j^2\) 是个斜率式子,所以用线段树维护以下即可。

错误原因(改进方法):

无。

反思:

感觉还好。

我比你高 2

时间:\(30min\)

知识点:\(\text{dfs}\),容斥

赛时思路:

我写了一个是给定的图是一棵树的代码,因为根节点有 \(k\) 种选法,其余的由于不能跟父亲节点的颜色一样,所以有 \(k-1\) 中,所以答案为 \(k\times(k-1)^{n-1}\)

错误原因(改进方法):

我们可以每次选定一组边,固定这两条边的颜色是一定的,所以就可以容斥得到答案,这样可以用 \(2^mnm\) 的复杂度过这道题。

反思:

在考试中要多拿一些暴力分,这道题可以敲一下 \(m=1\) 的做法。

10.7

题目 返乡 连接 习惯孤独 车站
期望得分 \(100\) \(20\) \(100\) \(0\)
实际得分 \(100\) \(15\) \(100\) \(0\)

返乡

时间:\(1h\)

知识点:构造

赛时思路:

一开始我没有任何的思路,但有一种感觉是这是一道结论题。然后观察了一下样例,发现每一行三个数之和是一样的,而且可以证明当和一定的时候一定不会发生三位偏序。所以我先用 \(O(n^2)\) 的复杂度,处理出当和为多少时,数量最多,然后 \(O(n^2)\) 输出答案即可。

错误原因(改进方法):

反思:

思维题做的太少了,以后要多做一些 CodeForces 的思维题。

连接

时间:\(1h\)

知识点:二分

赛时思路:

没什么思路,然后思考了很久后,写了一个 \(O(\sum l^2)\) 的代码,先预处理前缀和,然后枚举两个点,得到答案取最大值即可。

错误原因(改进方法):

第一是因为区间不一定会取整数,所以只能二分答案,而我误以为一定要去整数长度段,所以挂了 \(5\) 分。其次是有一个性质没有观察到,因为要取最大值,所以肯定有一边在两个不同密度的块的间隔处,而有了这个性质就好做了,直接二分答案,然后判断即可。

反思:

对二分掌握不熟练,有一些性质很难从题目中看出来,导致题目比较难想出来。

习惯孤独

时间:\(2h\)

知识点:\(\text{dfs}\),树形 \(\text{dp}\)

赛时思路:

我们可以把题目变成每次割掉一些树,使得满足条件,而此时第 \(i\) 次割掉的树的大小为 \(a_i-a_{i-1}\)(默认 \(a_0\) 的值为 \(n\)),所以这样就比较简单了,每次压缩状态,那些割掉树的操作已经做完了,所以每次转移即可。但有一点特殊的是割掉与父亲相连的边,所以我们可以预处理出除了这个子树的大小(也就是 \(n\) 减去这个子树的大小),所以也跟上面的差不多了。

错误原因(改进方法):

无。

反思:

其实想到了转化这一步骤后就比较好想、好写了,主要是转化这一步骤想了很久,要多做一些题目,了解一些题目的套路。

posted @ 2025-10-07 13:55  小熊涛涛  阅读(7)  评论(0)    收藏  举报