比赛总结
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\)
知识点:进制转化
赛时思路:
首先我们可以根据题目描述写出移动的过程:
所以可以简化得到:
所以我们需要减小 \(\sum_{i=0}^m\) 的值,所以用一个类似进制转化的算法就可以过了。
错误原因(改进方法):
考试时以为是要超过 \(n\) 就行了,所以移动过程变成了 \((1+x_1a)x_2^b\) 所以可以用 \(O(\logn)\) 的复杂度实现出来,小样例过了,但大样例错了,然后检查了很长的时间才检查出来。
反思:
考试时要看清楚题目。
黑哥的序列
时间:\(1.5h\)
知识点:\(\text{dp}\),线段树,斜率
赛时思路:
我们最先可以想到 \(\text{dp}\),并列出以下转移式:
所以我们接着发现 \(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\) 减去这个子树的大小),所以也跟上面的差不多了。
错误原因(改进方法):
无。
反思:
其实想到了转化这一步骤后就比较好想、好写了,主要是转化这一步骤想了很久,要多做一些题目,了解一些题目的套路。

浙公网安备 33010602011771号