【总结】学习记录(2024.11.2-12.1)

CSP-S 的准备算是告一段落了!
不出意外应该是可以晋级的(这段文字写于 11.4 15:42,16:00 查分)。

接下来要投身于 NOIP 的准备了!

关于文化课,倒是补了。但是效果如何就不得而知了。还有很多作业没有做呢。

但是补课真的好难受。初三这一年是一直要像这样停停补补吗?

2024.11.2 组队赛

终于回归了。

明天就是女生赛。

有一个队友生病请假没来,我就和学妹两个人打。
被爆杀了嘻嘻/ts

充分发挥不会概率期望的特长,签到快一个小时才过。(猜结论怕错。)

感觉配合还行吧,和学妹熟多了。在此之前好像没有说过话。
明天正常发挥就行。

2024.11.3 CCPC 女子赛重庆站

差不多是银首,实际绝对有金的水平。

不在学习总结里写这些话了。
所以游记不放了。

2024.11.4 DP 特训

好活!

由于要和同学们相互借鉴,就单开了一个

云程发轫小队 DP 特训总结汇总

2024.11.8 具有教育意义的短会

玩【】玩的。

遵守规房的机定。

2024.11.8 NOIp 模拟赛

T1 出的不好。对不起大家。

耗费了几乎整个晚自习的证明。

2024.11.10 CCPC 重庆站

1+1+1<1 的实力!

2024.11.12 NOIP 模拟赛

一般。

看到 T1 有点慌,怎么 T1 就出概率的。
以为是推式子,然后推不出来。最开始还扯到期望上去了。
后面发现好像算概率只能两两之间算。想了一个时间复杂度疑似正确的解法。然后写了,造极限数据跑的飞快,简单证明加感性理解(主要是感性理解)了一下觉得没问题就放了。

此时也已经过了 1 个小时了。
以为代码会很难写,其实也不难。不过中途也有弱智到把除写成了乘。很快也调出来了。

然后就开始罚坐了。T2 硬控我一整场。后来只好花了一些时间打了暴力。打完还剩很多时间,继续 T2。不会啊。。。

还有一个问题,T4 本来打了 35 的暴力。但是最开始把题读错了,所以特判 \(m=1\) 其实写错了。但是没发现,还剩 10 分钟发现了这个问题。当时大脑就宕机了,结果只有弄了一个看起来假的不能再假的做法交上去。

评讲得知 T2 是 DP 套 DP。疯掉了。评测发现除了一个做了 T3 的,剩下的都在比拼谁暴力打的更满。


唉,说这是楼上打的几场中最简单的一场。模拟赛打成这个样子,如何 NOIP 啊。


总结问题,还是在于卡题之后要变通。不能因为一道题卡住了就放弃别的题目。

对于这一场,虽然超纲是无法控制的,但是也有同学跳了 T2 做 T3 而且做出来。还是上个阶段某篇总结里提到的问题,每道题都要花一些时间想一想。

T2 归并

为什么考 DP 套 DP。严格来说没超纲是吧。


首先考虑一个很简单的 DP。假设目前已经确定了字符串 \(W\),去判定是否能通过 \(S\)\(T\) 归并得到。可以设一个 \(dp_{i,j}\) 表示能否用 \(S\) 的前 \(j\) 位和 \(T\) 的前 \(i-j\) 位归并出 \(W\) 的前 \(i\) 位。显然此状态是可行性状态,值为 \(0/1\)

但是我们并没有 \(W\),反而是要对其计数。那么如何把这个状态用起来呢?

考虑 DP 套 DP。把这个状态压到一个新的状态里。

\(f_{i,s}\) 表示 \(W\) 的前 \(i\) 位满足其判定的 \(dp\) 数组的值为 \(s\) 所表示的信息时有多少种可能的字符串。相当于把 \(dp\) 数组压到了 \(s\) 这一维。

\(s\) 的第 \(j\) 个二进制位的值表示 \(dp_{i,j}\) 的值。

转移非常简单。分别讨论当前这一位填 \(0\) 还是 \(1\),根据 \(i-1\) 的状态,求出 \(i\)\(s'\) 转移即可。

注意到,\(n,m\leq 50\)。第二维状压放不进数组,需要使用 \(map\)。能过的原因是题目保证 \(S\)\(T\) 随机生成。为什么随机生成状态就少,杜老师给出的解释是:“你会发现它跑得很快。然后就能过了。”

到底为什么我不知道。Frank 都不知道的我能知道吗。

代码非常简洁。

PMJN

T3 最大独立集

对于这种求全区间答案和的题目,两个思考方向:

  • 线段树(或其他类似数据结构)+扫描线。
  • 分治。

对于这道题,答案显然只能 DP 求。所以用线段树和扫描线不好处理。

考虑分治。分治的做法就是每次规定一个分治中心,区间必须经过该分治中心。

这道题目想到这里,后面的内容就不是很难了。

\(mid\)\(l\) 求出一个后缀 \(dp\) 数组,\(mid+1\)\(r\) 求出一个前缀 \(dp\) 数组,答案就是两段拼起来。由于 \(mid\)\(mid+1\) 不能同时选,最初的答案规定这两个位置都不选。但是答案可以更大,于是就在选 \(mid\) 和选 \(mid+1\) 中取较大值即可。

\(f(l,r)=dp1_{l,0}+dp2_{r,0}+\max\{dp1_{l,1}-dp1_{l,0},dp2_{r,1}-dp1_{r,0}\}\)

如何快速求答案?

首先,\(dp_0\) 的值可以提前计算。

对于 \(\max\) 的那一部分,将差值存下来,由大到小排序,再随便算算就行了。

复习的时候如果觉得说的不清楚,请结合代码理解。

T4 传送阵

提一下大致思路。

考虑如果所有点都去到里当前位置最近的传送点,那么代价就是这些点中花费最大的。

所以不妨求出每个点到最近的传送点的距离(分讨做),再按其从小到大排序。

二分一个时间限制 \(T\),check 时枚举一个 \(i\),钦定前 \(i\) 个人去最近的传送点,后 \(n-i\) 个人不走传送点。

判断 \(i\) 可行的条件是:对于后 \(n-i\) 个人,对于每个人求与其曼哈顿距离小于 \(T\) 的范围,对 \(n-i\) 个范围求交,再对交求与其曼哈顿距离小于 \(T-max\)\(max\) 为前 \(i\) 个人与最近传送点距离的最大值)的范围,若范围内有传送点则可行,否则不可行。

很好理解,第一步的交是后 \(n-i\) 个人在 \(T\) 时刻内都可以到达的点,第二步的范围内的传送点保证前 \(i\) 个点可以到达此传送点后在 \(T-max\) 时间内到达后 \(n-i\) 个人的集合点。

曼哈顿距离的交不好求,要转化成切比雪夫求解。

杜老师说这个做法是 \(O(n\log^2n)\) 的,有一个神奇的使用 random_shuffle 的做法可以做到 \(O(n\log n)\),不过我没听懂。

2024.11.13 做题

由于昨天考了 DP 套 DP,所以给我们找了一些题做。

做了两道题,不过这两题基本相同,稍微提一下。

M P

还是和模拟赛 T2 一样的计数题。

由于最长公共子序列,所以可以写出求解 LCS 的转移方程。

同样,设一个状态 \(f_{i,S}\) 计数。需要把求解 LCS 的 g 数组压到 \(S\) 里。但是 \(g_{i,j}\) 并不是 \(0/1\),不能直接压。但是不难发现,\(g\) 的差分数组只含 \(0/1\),就可以压了。然后用一样的套路处理即可。

对于 M 题,把状态再多设一维,转移稍作修改即可。

代码。

这两道题还是不太难的。和模拟赛 T2 没有什么区别。目前能总结出的一些东西是,为了压到数组里,或许需要考虑怎样把信息转成 \(0/1\) 信息,并且要满射双射

不过如果有类似模拟赛 T2 那样随机的性质,保证状态数不多的话,或许用 \(map\) 可以在状态里放一些不是 \(0/1\) 信息的东西?

2024.11.14 NOIP 模拟赛

概括主要情况和比赛策略。

T1 先做了 2 小时,不会正解。然后花了几分钟打了 T3 15 分的暴力,继续 T1。2 小时 40 分钟左右把 T1 不带高精的 70 分写了,决策开 T2(因为已经通读过题面,T2 有一点思路)。想了 15 分钟左右会了 T2,正解写+调结束后,距离结束还有 50 分钟。T4 看过,暴力也想了,决定写 T1 剩下高精的部分。最后没有调出来。

整体比赛策略其实没有什么问题,最后选择放弃 T4 暴力而去打高精也是因为还有 50 分钟,较为宽裕的时间。

在 T2 这道题上做的不错。思路没有歪,想出正解也很快,代码也没有调太久,稍微调了就过了。

分析导致结果不佳的主要问题:

  • 状态不佳:模拟赛的前两个小时都比较困倦。精神不集中,这两个小时都花在了 T1 上,导致思路歪+进展慢,头脑不清醒导致效率低下,浪费过多时间间接导致最后没有调完高精。
    犯困的原因不得而知。昨天晚上睡得比较早(23:10),但是仍然比较困。个人认为可能是集训压力大,用脑多,近几个月都略有休息不足,也有个人身体特性(感觉比其他所有同学都缺觉)(根据运动手环上的数据,睡眠质量也不太好)。
    因为这些原因,并没有找到很好的调整方式。23:00 以前睡觉几乎不可能,或许以后可以考虑模拟赛的时候买一杯咖啡。我也不知道怎么提升睡眠质量。

  • 代码力弱。高精其实会打,但是距离上次打高精已经有不知多久了。十分不熟悉,写法都是考场上现推的。并且也出现了许多细节问题,即使最后留有 50 分钟写高精也没有调过。
    补题的时候调过,也确实是一个很小的问题。
    以后对于一些不常考的知识点也要有复习。同时,也要提升代码力

主要是以上两个问题导致了 T1 没过和 T4 暴力没写。

理想状态应该是快速过 T1(或者说因为不熟悉高精的原因,稍慢一点也在允许范围内,但是不应该出现今天这样耗费过久时间的问题)。T2 在赛上也没花多少时间就会了。

听评讲,T3 不难。如果在前两题可以较快通过(例如 2 小时左右),T3 有较大可能性拿到 \(n^2\)(65 分)暴力,想出正解也是在能力范围内。同样的,T4 也并不非常困难。至少暴力分应拿到 20 分。

总而言之,这一场最大的问题还是在于状态不佳,也有 T1 的思路与解法或许比杜老师讲的解法稍显复杂导致的浪费时间

还是:

  • 要注意状态,不犯困。
  • 代码力需提升。
  • 思维。题目不会,尤其是理论上难度应该不高的题目不会,应及时换换思路。

T1 分解因数

  • 如果当前 \(x\) 是偶数,就把 \(x\) 除以 \(2\),并递归处理子问题 \(\frac{x}{2}\),并把子问题中的答案统一乘 \(2\)
  • 如果当前 \(x\) 为奇数,就找到一个最大的 \(k\) 满足 \(3^k\le x\)。然后递归处理 \(x-3^k\) 的子问题。这时 \(x-3^k\) 一定是偶数。

证明不会出现倍数关系:

  • 关于偶数的处理显然。
  • 关于奇数的处理,已知 \(x<3^{k+1}\),所以 \(x-3^k<2\times 3^k\),接下来再除以 \(2\) 后,\(\frac{x-3^k}{2}<3^k\),相当于 \(2\) 的指数变大,\(3\) 的指数一定变小。所以不会出现倍数关系。

杜老师给出的构造方式非常巧妙,也很好实现,应该是这道题目最优的解法。但是考场上并不一定能直通最优解法。对于有一定难度的构造题,不同选手想到的构造方法是不一样的,也会有优劣之分。

考场上我花了很多时间,想了一个略复杂,甚至我自己都没有完全证明正确性的做法。

同时,还有对高精度的遗忘与不熟悉。

代码贴在这里,有机会可以想想能不能证明。

T2 序列反转

水题。考场上没做多久就会了,代码也是标准的线段树,没什么细节。但是考场上还是调了一会,说明代码力还是不够。


如果尝试模拟一些样例,会发现操作呈现这样一个规律:

  • 序列中一开始有 \(k\)\(1\),则会从 \(k\) 位置开始。
  • 设当前翻转一个位置 \(x\)。如果 \(s_x=1\),则反转后 \(s_x=0\)\(1\) 的个数减少 \(1\),下一步操作的位置是 \(x-1\)。若 \(s_x=0\),则下一步操作的位置是 \(x+1\)
  • 结合上条发现,当前面有一串连续的 \(0\) 时,会在遇到后面的第一个 \(1\) 时停止,并后退;同样,后面有一串连续的 \(1\) 时,会在遇到前面的第一个 \(0\) 时停止,并前进。
  • 又因为:前进会把 \(0\) 变成 \(1\),所以后退时这一段不会阻碍后退;反之亦然。
  • 所以最后操作转换成为,最初的位置 \(k\) 左侧所有的 \(0\) 和右侧所有的 \(1\),每次操作的位置就像一个球在其间来回滚动,且碰到一次后这个障碍就会消失。
  • 相当于,最初的位置 \(k\) 左侧所有的 \(0\) 和右侧所有的 \(1\) 会对答案有贡献。

虽然每一次是在一个 \(1\) 和一个 \(0\) 之间操作,但最后的答案并不关心具体是哪两个配对。所以只需拆一下贡献,稍微推导可知答案为:

\[\sum_{i=k+1}^n 2\cdot i-1[s_i=0]-\sum_{i=1}^{k-1} 2\cdot i-1[s_i=1] \]

还缺少了一个部分。如果 \(s_k=1\),最终答案需加上 \(k\);反之,最终答案减去 \(k-1\)

可以理解为,对于在其两侧的 \(1\)\(0\),会被算两次贡献,一次 \(i\),一次 \(i-1\),而 \(k\) 只会经过一次,取决于是向前走(贡献为 \(k\))还是向后走(贡献为 \(-k+1\))。


最后套个区间修改,线段树维护即可。

注意,显然有 \(k\) 左边的 \(0\) 和右边的 \(1\) 个数相等,所以没有无解情况。

code.

T3 点支配集

一道不是很难的 DP。


题面弯弯绕绕像加密了一样,可以转换成:在 \(n\) 个区间中选择若干个区间,使得 \(n\) 个区间每一个至少与一个被选区间有交(端点亦可)。求合法选择的方案数。

看到这个,就可以想起一道上个阶段集训做过的 T2

所以不妨忽略掉用于覆盖的区间和被覆盖的区间来自同一个集合,当做两个不同的集合,没有影响。

对于被覆盖的区间,若一个区间包含另一个区间,则这个大区间可以去除。因为包含其中小区间就等价于已经包含了次大区间。去掉无用信息后,可以得到一些左右端点都单调递增的被覆盖区间。

对于用于覆盖的区间,则不能做刚刚提到的 T2 那样的处理。因为本问题是计数,而非最优化

可以处理出每一个用于覆盖的区间可以覆盖到哪些需要被覆盖的区间。由于处理后其左右端点都单调递增,所以是一个连续的区间。

转化后,问题变成在 \(n\) 个区间中选择若干个区间,要求覆盖 \(1\sim cnt\) 所有点(\(cnt\) 为去掉无用区间后的个数),求合法方案数。

此处贪心的部分就结束了。其中由于不能像提到的 T2 一样把用于覆盖的区间也去掉某些包含关系,所以不满足左右端点都单调递增,所以无法使用双指针。

这里使用的是二分查找。在 \(O(n\log n)\) 这一级别。


关于计数不难想到 DP。

设状态 \(dp_{i,j}\) 表示使用前 \(i\) 个区间,覆盖了 \(1\sim j\) 的方案数。转移也非常简单,设第 \(i+1\) 个区间左右端点分别为 \(l\)\(r\),此处采用刷表法表示:

\[\begin{aligned} dp_{i,j}&\rightarrow dp_{i+1,j}\\ &\searrow dp_{i+1,\max\{r,j\}}[l\le j+1] \end{aligned}\]

不过多解释。

分析这个转移,等价于:

  • 区间 \([1,r-1]\) 不变。
  • 区间 \([r+1,cnt]\) 整体乘 \(2\)(分别继承原来的和通过第二个转移得到)。
  • 单点 \(r\) 的值为原来的值加上区间 \([l-1,r-1]\) 的值的和(分别继承原来的,和通过第二个转移,取 \(\max\) 后为 \(r\))。

这几个操作显然可以线段树维护。


还有一个小问题,对 \(n\) 个区间如何排序,也就是确定 DP 顺序,保证没有后效性,可以算出正确答案。

正确的是按照左端点排序。由于状态只记录 \(r\),所以要求前缀尽量都被覆盖,才不会漏转移。

结合具体例子理解:

  • 三个区间分别为 \([1,3],[5,7],[2,9]\)。如果按照右端点排序,DP 转移顺序就是这个排列。模拟或测试发现,第 2 个区间 \([5,7]\) 无法转移,因为位置 \(4\) 没有被覆盖。但是如果按照左端点排序,则位置 \(4\) 会被区间 \([2,9]\) 先覆盖,\([5,7]\) 就可以转移了。

结合这个例子可以直观理解到,后续转移的基础是前缀已经覆盖完。所以按左端点排序。


总的来说难度并不是很高。

T4 移球游戏

感觉思维难度并不很高。代码比较难写。

先写后面的东西,有时间补。

原题。

2024.11.16 半期考试

概括主要情况和比赛策略。

先花了十几分钟看题和每道题加以思考。因为 T1 一眼水,所以决定先放一放,而是先思考后面的题目。主要在想 T3。花了很久时间,直到 9 点左右,都一直在思考和写一些比较暴力的代码测试想法。

9 点过写 T1。但是由于没有想清楚就写,也就是没有做好规划,导致代码频频出错又多次修改,还有慌乱的感觉,导致花了 1 小时左右才完成。

后来继续思考 T3。但是没有思路。实际上思路歪了,往 DP 方向去考虑了。又转回来想 T2,但是种种因素加在一起,包括心态慌乱,思维有点乱,想到了接近正解的地方,但是转移的细节想不清楚。最后迫于没有时间,转而写暴力。T3 的暴力也不好打,所以打了 T2 和 T4。最后暴力也挂分了。T2 挂了 10 分,T4 挂了 20 分。

总体来说,这场打的非常糟糕。从几个方面来讲:

  • 比赛策略和时间规划。我认为这场比赛最糟糕的地方在于 T2 和 T3 换着想,没有很深度的思考。可以说后来思考 T2 的那段时间非常乱,思路不清,所以细节想不清楚。通过这次考试,我认为一个适合我的策略还是先把能拿的分拿了,而不是先去做后面的题。
  • 所以总结出一个适合我的比赛策略:
    1. 首先花 20 分钟左右读题,每道题至少 5 分钟思考时间。这 5 分钟需要理解正确的题意,也就是要确定,千万不能读错。同时,有一些初步的思考,得出一些初步的方向,例如这道题需要一个怎样的时间复杂度,是哪种类型的题目,可能用到哪些算法。还有比较重要的,难度评估,相对于自己来说哪些题目可能更好做
    2. 接下来需要把有把握,稍简单的(例如 T1)做了,保证有个保底的分数。一般情况下,都还需要对拍。当然,不急着立刻对拍,要想清楚所需时间进行规划。
    3. 做完有把握的题目之后,需要给剩下题目中有较多思路或认为相对难度较低的题目多分配一些时间。注意,不得超过 1 小时。
    4. 遇到卡题,无思路,一个比较好的解决方式是去打别的题目的暴力。可以换一换脑子,也不会无意义地浪费时间,至少有暴力保底的分数
    5. 对于我个人而言,切忌来回思考两道甚至更多。由于思维能力的局限,想要做出一道题目,我必须有足够多且深度的思考。来回思考不能保证思考的深度,很容易出现今天这种情况。
  • 除了比赛策略,其实心态也是老生常谈的问题。但是大多数时候心态的爆炸都是由比赛策略的问题引起的。长期卡题、一直没有多少分数等等都有比赛策略的问题。所以不仅要做好比赛策略,也要尽量保持冷静,确保思考的质量
  • 写题之前要有规划。首先要把大体细节想清楚,要在草稿纸上记下一些关键点和易错点,防止忘记,有效地提升写代码和调代码的速度。

以上是比赛策略有关的部分。

接下来谈一些实力问题:

  • 代码力还是不够。T1 调的还是时间比较长。这一点也有在慢慢改进,打算有时间了之后去学习一下封装的技巧。现在还是不太会。把代码模块化之后,感觉会清晰、好调很多(例如前几天的高精)。
  • 思维能力欠缺。T2 虽说有思路混乱的原因,但还是感觉到思维不够的问题。这一点,在集训中也会练到,需要加强。平时需要多多思考,老师布置的题目一定要独立思考,锻炼思维。如果没有做出来,解法一定要理解透彻。
  • 知识点不够牢固。T3 是一个例子,本身是讲过的结论,但是考场上没有回忆起。说明对知识点的掌握还是欠缺。需要复习回顾,课堂讲的东西下来要好好消化
  • 暴力还是容易写挂。这一点现在已经在按照老师说的方法练习。不仅要练习速度,也帮助自己更好地规划考场决策。

总结中提到的问题需要改进,要按照提到的方法去做。

T2 归类

一个比较简单的 DP。

一个显然的性质是一种颜色要么全部不动,要么全部移到最后。还有一种特例,只有一种颜色可以只移一段前缀,保留一段后缀不移动。

非常好理解。

所以直接设一个状态 \(dp_i\) 表示处理了 \(i\sim n\) 的数字,能够保留的数的最大值。

相当于把贡献反过来计算。因为好转移一些。

转移:

  1. 考虑保留颜色 \(a_i\)。这一步显然只能在颜色 \(a_i\) 出现的最靠前的位置转移。
    设颜色 \(a_i\) 最靠前的位置为 \(l_{a_i}\),最靠后的位置为 \(r_{a_i}\)。显然区间 \([l_{a_i},r_{a_i}]\) 中颜色非 \(a_i\) 的数字都需要移动。
    所以转移为 \(dp_i=dp_{r_{a_i}+1}+cnt_{a_i}\)
  2. 考虑移动当前数字。因为移动对答案没有贡献,所以直接 \(dp_i=dp_{i+1}\)
  3. 考虑特殊情况。当前颜色保留一段后缀不移动。
    假设区间 \([i,n]\) 中颜色为 \(a_i\) 的点不移动,则区间中剩下的其他颜色点一定会移动。同样区间 \([1,i-1]\) 中的颜色为 \(a_i\) 的点也会移动。最后保留的只有这段后缀。
    转移为 \(dp_i=suf_i\)\(suf_i\) 表示后缀 \([i,n]\) 中颜色为 \(a_i\) 的点的个数)。

三种转移取 \(\max\) 即可。

code.

T3 共价构树

首先,一颗树一定是二分图。

其次,树在二分图中,一侧是奇数深度的点,一侧是偶数深度的点。

再者,这题要求奇数深度的点有 \(k\) 个,总共 \(n\) 个点。等价于计算一个一侧 \(k\) 个点,一侧 \(n-k\) 个点的完全二分图生成树数量。

又有,一个一侧 \(n\) 个点,一侧 \(m\) 个点的完全二分图生成树数量为 \(n^{m-1}\cdot m^{n-1}\)

接着,本题为有标号有根树(\(1\) 为根),所以要对标号组合计数,并钦定 \(1\) 在奇数侧。

最后,答案为 \(C_n^{k-1}\cdot k^{n-k-1}\cdot (n-k)^{k-1}\)

T4 消除游戏

T3 和 T4 为什么都出二分图。

这就是半期考试吗?


由于构成质数,且除了 \(2\) 以外都是奇质数,且只有 \((1,1)\) 能够构成 \(2\)。所以除去 \(1\) 的影响,对于能够构成质数的点两两连边,会组成一个二分图。奇数一侧,偶数一侧。

不含 \(1\) 的两档数据只需建出二分图,先跑最大匹配,如果还有剩余操作数,则根据剩下没有被匹配的点的度数计算答案。随便搞搞就行了

考虑有 \(1\)

首先,\(1\) 的作用是非常大的。\(1\) 可以和偶数组成质数,也可以内部消化组成 \(2\)

相当于,只要有大于一个 \(1\)\(1\) 就可以内部消化完。但是一个偶数可能只能与 \(1\) 组成质数。所以这两种匹配的优先级应该是先匹配 \(1\) 和偶数,再匹配 \((1,1)\)

所以在建图时不加 \((1,1)\) 边,跑二分图匹配,再处理 \((1,1)\),再处理没有被匹配的其他点。

有一个细节:
注意到,\(1\) 的作用比别的数要大。考虑这样一种情况,某一条增广路以 \(1\) 开头,结尾非 \(1\),长度(边数)为偶数。等价于其有两种选择方式,一种是选择 \(1\),即选择在这条增广路上编号为奇数的边;另一种是不选择 \(1\),即选择在这条增广路上编号为偶数的边。显然只考虑这里贡献是相同的,但是由于 \(1\) 还可能有更多的用处,所以一个更优的解决方案是在这条增广路上不选择 \(1\)

在二分图中处理这种情况,只需要以奇数侧为开头跑匈牙利,且先跑其他奇数,最后处理 \(1\)。显然,\(1\) 如果被选,一定是找到了贡献更大的增广路。

细节还是有点多。不过整体而言难度并不很大。

code.

Week 1 总结

打了两场 NOIP 模拟赛和一场半期考试。

其中第二场模拟赛的比赛策略做的不错,第一场发挥一般,半期考试比较糟糕。

主要需要注意的地方:

  • 代码力。
  • 比赛策略(在半期考试总结中有详细的说明)。
  • 心态问题。
  • 思维能力和知识点的复习。
  • 实现暴力程序的速度。

这一周从模拟赛里学到了一些新的 trick,总结出了一套适合自己的比赛策略,也规划了提升代码力、思维能力和综合实力的方法,也提上了训练强度。

在下一周,要落实这些内容,争取在模拟赛中做得更好。

半期总结

前半期主要只复习了两个专题知识点:

  • 二分图匹配。
  • 搜索。

这两个知识点单独拿出很多时间进行了讲解和做题。

对于这两个知识点,感觉还是只会做简单题和中档题。难题仍然欠缺。

剩下主要是准备 CSP 和 NOIP 的集训,期间穿插有一些:

  • 计数,容斥。
  • T2 专练。
  • 代码力训练。
  • DP 专练。
  • DP 套 DP。

不过基本也没有系统地讲某个知识点。大多数时间在练习。
对于这些知识点也分别有总结,特别是在 DP 专练中从同学分享的题目中学习到了很多。

半期的大部分收获还是主要来源于模拟赛。

从中学习到了有关比赛策略,提升了思维和代码力,也见到了很多 trick。

能够感受到实力有提升。CSP 最后的结果我并不满意,目前也在积极准备 NOIP。应该尽力执行老师布置的任务,让实力提升更快;需要逼自己一把,才可以突破舒适圈,提升上限。

接下来需要继续努力,加把劲,在 NOIP 取得一个好的成绩!

2024.11.19 NOIP 模拟赛

好消息:T2 没用容斥刚出来了!
坏消息:赛上脑子抽了没调出来。

这场比赛我认为在策略上没有问题,基本执行了上次总结制定的比赛策略。依旧打得不好,只能说是实力不够的问题。

首先花了 20 分钟读题思考,把 T1 过了,并写了对拍验证,确保没有问题。此过程花了 20 分钟。

T2 做了较长时间,由于评估了 T3 和 T4 的难度,没有想这两题的正解。暴力留了约 1 小时。但是由于 T4 题意最开始没完全弄懂,菊花的特殊性质分也调了很久,没有特判处理 \(n=2\) 没得到分,T3 只写了 8 分暴力。

T2 花了很多时间,完成了自己做法的前半部分,却不会做后半部分。想了很久,在考试快要结束时发现之前考虑过于复杂,会了正解,但是迫于时间不够没有写完,考试前 5 分钟左右就放掉去检查了。

总体而言,问题如下:

  • T4 在最开始读题没有完全搞懂题意,导致暴力花费过多时间。复盘认为当时发现 T1 很水之后还是有点急,这 20 分钟没有落实到位。以后不可以急,最开始读题的时间一定要确保题意理解正确,模拟样例可以解决这个问题。
  • T4 的暴力再一次写挂。没有考虑到边界情况,没有特判。不过我认为还是没有读懂题导致的问题。以后暴力一定要多注意细节。
  • T2 最后差一点还是自己的实力问题。推出了绝大部分解法,但是由于思维局限性,以为后一部分必须用某个方法做,思维就困住了。一直没有看清楚这个问题的本质只需要把前一部分的 DP 稍作改动就可以处理。最后想到了正解,却没有时间写完了。考后下午来花了 5 分钟改完就通过了。
    感觉还是挺遗憾的。不过归根结底是实力的问题。

也有做的不错的地方:

  • 虽然 T2 没有写完,但是至少想到了正确的解法。并且我使用的方法是以 DP 特训 A 题的插入 DP 技巧为基础的做法。
    感觉自己的 DP 能力有所提升!

最后分数比大众分低也是因为,T2 已经想到了绝大部分,T3 和 T4 我没有写的暴力又都代码量较大且难调,分值也低。所以综合考虑决定冲 T2 正解多出 80 分,放弃了后面性价比不高的 20 分。

其实这个决策也没问题。

总而言之,还是实力需要继续提升!多次模拟赛,我也看到了自己实力的瓶颈,也有进步,接下来需要持续提升,尝试突破上限!

T2 排列计数

没用容斥,硬设了 5 个状态做的(

首先可以发现,与 \(a_i\) 有限制关系的只有 \(a_i-k\)\(a_i+k\),且数字互不相同,所以与每一个数有限制关系的之多两个。把这些关系当做边连接,最后的形态应为若干条链,节点与相邻节点在原序列中不能相邻,链与链之间没有限制。

所以也并不关心每个节点的值具体是多少,只关心有多少条链和每条链的长度。

这个随便处理就行了。

接下来考虑一条链上的情况。

由于一个数可能与两个数有关系限制,所以我们按顺序添加,第 \(i\) 个数只需要考虑不与 \(i-1\) 相邻即可。

使用插入 DP 的思想做。

\(dp_{i,j,0}\) 表示已经添加了前 \(i\) 个数,共 \(j\) 段,第 \(i-1\) 个数被包含的方案数。
\(dp_{i,j,1}\) 表示已经添加了前 \(i\) 个数,共 \(j\) 段,第 \(i-1\) 个数在一段的两端(不含左右边缘) 的方案数。
\(dp_{i,j,2}\) 表示已经添加了前 \(i\) 个数,共 \(j\) 段,第 \(i-1\) 个数在左右边缘的方案数。
\(dp_{i,j,3}\) 表示已经添加了前 \(i\) 个数,共 \(j\) 段,第 \(i-1\) 个数独立成段(不在边缘) 的方案数。
\(dp_{i,j,4}\) 表示已经添加了前 \(i\) 个数,共 \(j\) 段,第 \(i-1\) 个数在边缘独立成段的方案数。

状态这样设计就非常完备了,可以覆盖到每一种情况且不会算重。状态转移:

\[\begin{aligned} dp_{i,j,0}&=j\times dp_{i-1,j+1,0/2}+(j-1)\times dp_{i-1,j+1,1/4}+(j-2)\times dp_{i-1,j+1,3}\\ dp_{i,j,1}&=(2j-2)\times dp_{i-1,j,0/2}+(2j-4)\times dp_{i-1,j,3}+(2j-3)\times dp_{i-1,j,1/4}\\ dp_{i,j,2}&=2\times dp_{i-1,j,0/1/3}+dp_{i-1,j,2}+dp_{i-1,j,4}\\ dp_{i,j,3}&=(j-2)\times dp_{i-1,j-1,0/1/2/3/4}\\ dp_{i,j,4}&=2\times dp_{i-1,j-1,0/1/2/3/4}\\ \end{aligned}\]

时间复杂度 \(O(n^2)\)

每一条链的情况就算完了。但是如果考虑合并,其实并不好做(考场上想了很久该如何合并,还是不会)。

实际上,上面的转移的限制是 \(i\)\(i-1\) 不能相邻。改成正解很简单,只需要算出哪些地方是断点,也就是链与链之间,不需要考虑不能相邻的限制,转移稍作修改即可。

code.


总而言之,没用容斥,其实是一个很暴力的做法。

考场上被降智了,居然没有想到这个小小的改动,一直在想怎样合并。

插入 DP 这个 trick 理解得还不错。

T3

T4

2024.11.20 ARC187

之前没有打,但是补题。

题目质量都很高!

A

小构造。但是下午好像有点困,导致一直没想出来。我也不知道为什么。

清醒了之后马上就会了。

未完待续。

B

DP。

未完待续。

C

只会 \(O(n^3\log n)\) 啊啊啊啊啊!

2024.11.21 NOIP 模拟赛

总结主要问题:

  • 有一定先入为主的想法,主观认为 T2 难度大。加上实力不够,没有做出 T2。
  • T3 暴力留的时间过少。

整场比赛策略没有大问题。唯一不足在于留给 T3 的暴力时间少了一点,暴力没有调完。说明放掉前面没做出来的题去拿后面保底分这件事还是不够果断。下次要注意改进这个问题。

T2 没做出来是整场比赛最大的问题。

  1. 不应先入为主。感觉在做多了难度较高的模拟赛之后对难题有畏难感。也有一定程度的先入为主认为难度高,逃避的思想。这是万万不可取的。做题千万不能让外界的评价影响到对题目的投入程度。
    以后要注意这个问题。对于一场模拟赛,题目顺序在大多数时候隐含难度顺序,但不是绝对的,这一点是作为参考场外因素绝不可取,不能因为主观情绪影响对题目的处理。

  2. 不知应说是思维不够好还是套路不够熟。两者兼有之吧。
    看到全区间统计问题没有想到拆贡献应是对于套路掌握不够好。下次要记住这个套路。
    看到表面上线段树不好处理的问题,就一直在考虑分块一类的处理方式,却迟迟没有想到转化问题,有思维固化的问题,也有做题方法不够完善
    一条路走到死这种做题方式是不可取的。以后应采用广搜的方式,抓住一个关键点可以执行深搜,但是也不能过头。及时回溯,不能让思维固化。

以上。总而言之,最大的问题还是实力不够,接下来努力提升!

T2

T3

T4

还没有完全搞懂。

题解。

2024.11.26 NOIP 模拟赛

本场比赛策略没有问题

优点在于执行了比赛策略:开场 20 分钟看题,过了会的题目(T1),因为是计数所以没有对拍;T2 在迟迟未想出正解的情况下做了一个多小时就跳了,有 75 分暴力分;T3 尝试正解,没有做出来,最后打了两题的暴力。

暴力没有挂分。这一点需要继续保持。

问题:

  1. 思维不够活跃。T2 一直在想如何在暴力的基础上提升,没有考虑到暴力的思路其实没有前途。适时换思路想是非常重要的
  2. 多动手,用纸笔打草稿。想 T2 的时候有点固执,几乎没有动笔写什么。如果动笔我认为大概率会把 \(q-p=k,n=p(p+k)\) 这一点推出来,后面就很可能做出来了。
    以后要记住一定要动笔,光用脑子想不行。
  3. 数学能力不够。与其说是数学,不如说是思维能力的问题。这一点只能慢慢来,尝试在做题的过程中提升思维能力。
  4. DP 能力不够,对新知识的消化理解不够。T3 有用到 DP 套 DP 的思想,但是考场上都没有往这个方面想。所以 DP 要多练题。把知识点掌握好。
  5. 暴力分没有拿完。T3 的大众分是 40 分,我只拿了第一档 20 分。可能有去想正解的原因,但是保底分还是要拿到。以后做题要先把每档暴力都想一想,评估一下思维难度和代码实现难度,简单的暴力分不能丢

这段时间好像比较缺乏信心。感觉并没有哪一场是把实力真的发挥出来了。心态需要调整,NOIP 要努力冲一把。

T2

T3

T4

2024.11.28 NOIP 模拟赛

虽说是考前最后一场模拟赛不用提交总结了,但是还是要写的。

个人感觉今天这场总体来说还可以吧。没有意料之外的事情发生,无论好的坏的。

算是把大部分实力都发挥出来了。

简单总结问题:

  • 状态真的很重要很重要。感觉 20 分钟看题+20 分钟 T1 后,从 8:40 到 9:40 的效率极低。那段时间就是我今天早上犯困的时间。9:40 过后,忽然就清醒了。T2 一直卡住的问题也很快就会了。
    这说明状态的重要性。这一小时全在空想,一个式子也没推,效率非常低。但凡这一个小时的效率能变为原来两倍,这在不困的情况下是很容易做到的,相当于至少多出半个小时,这半个小时拿给我继续完善 T3 肯定可以拿到 90 分的。

  • T3 暴力 90 分没拿满。主要在于 T2 浪费的时间和调试的时间太长,导致 T3 时间不是非常够,所以也有点慌乱,check 最开始想的方向都错了。意识到不能用贪心做之后已经晚了。同样的,随机的性质是想到了的。但是同样由于上述种种原因,没有考虑清楚,求的是集合的数量!直接交了个 9 的幂上去,好像骗了 10 分。
    一个还是上述状态的重要性,一个是代码调试,一个是心态不能乱

  • 一个小点。平时做题一定要注意注意!!!关于某些会爆 long long 的地方,一定仔细写。每一个括号里面会爆的,都要加上 1ll!因为这个东西虚空调试很久,不值得!

没有什么了。预计明天写一个赛前注意事项和准备。加油吧。

2024.11.29

update on 2024.12.1:

实际没有写什么注意事项。

其实我觉得也没啥必要,这些模拟赛下来,整个比赛策略已经非常完备,考前最后一场也算是把策略发挥到极致了。

就这样吧。

2024.11.30 NOIP

游记。

补充

有待完善:

  • 2024.11.14 模拟赛 T4
  • 2024.11.19 模拟赛 T3 T4
  • 2024.11.20 ARC187 补题、题解
  • 2024.11.21 模拟赛 T2 T3 T4
  • 2024.11.26 模拟赛 T2 T3 T4

后记

update on 2024.12.1:

怎么说呢,收获很多。

(这篇学习总结欠了好多东西没写哦!)

NOIP 算是发挥出了大部分实力,也不是完全满意的。

不过没有像 CSP-S 一样犯下重大失误,也算是比较圆满了。

接下来,又要步入令人讨厌的补课生活。

唉。没事。继续加油嘛。

后面就要学习省选知识啦!虽然现在感到有点害怕,因为感觉会很难。或许我的智力在 NOIP 级别得知识就已经达到上限了吧(笑)。

没事。加油吧!

posted @ 2025-04-28 16:55  PhainonK  阅读(18)  评论(0)    收藏  举报