XCPC 训练记录 - 上
序幕
12.26 一天切了 6 个 *2600, 飘了,决定好好训一年。
训练思路:按难度板刷 cf,并积极参加各种比赛。
这里记录遇到的技巧、比赛复盘、做题复盘啥的。
12.28
- 欧拉序 树上单点修改查询链和 trick:
记下每个点再 dfs 序中进入和离开的时间戳,单点修改时差分修改从进入到离开的一整段,查询两个点进入位置中间的和就可以查询一条链上的和。 - 平行二分
头回见平行二分的技巧:你有一堆询问需要二分,每次需要查 1 到 mid 的信息,但难以每次快速查询,这时可以一起二分,每次从头到尾跑一遍回答相应的 mid。你可能会奇怪:为什么要每次从头到一遍不直接记下每个位置的答案?因为有的时候是无法把所有信息都存下来,但是按需查询却是可以的。比如一棵树,每个点有颜色,你需要在一些点二分颜色的值域的右边界,那么不可以把每个点的每个值域都存下来,但是配合其他技巧可以每次塞进一个颜色并查询。此时这样可以代替主席树上二分。
12.29
前夜的 cf 掉分了,E 写得太慢了一些,F 赛时想到的做法几乎是对的,但是没能调出来。
-
E 想了个换根的做法,这不是最简单的做法,但是也挺短的。赛时问题在于讨论不清晰,想当然地合并了开始时 p 在不在叶子的两种情况,以及转移的时候出现了混淆,应该凭这个更新还是叶子更新。这两个问题都曾在脑海里飞过,不过我快速地做出了错误的判断,感觉写代码要提升准确率就在于对脑中自然飞过的问题有清晰的认识,不要放过成为模棱两可的东西。
-
F 是个有趣的题目。赛时每行填充的相同的性质,以及除了近两行出现过的以外转移类似的性质都发现了,但是有好几个代码上的小错误以及两行没出现的转移搞错了。赛后看题解还一脸懵以为是做法假了,其实我想的就是对题解的一个直观理解。题解的做法是,其它的转移都是形如 \(x = \max(a, x + b)\) 的形式,这个东西是有结合律的,可以整个打标记。然后题解戛然而止了,只提示说可以每个都用这个形式转移来实现。令我有些莫名其妙。其实把这个操作合并起来的形式就是要到第 \(i\) 行某个颜色 \(j\),\(j\) 在前面两行没出现的时候有两种转移:一是从之前的一个 \(j\) 出发,一路把中间的全填成一样的拼到第 \(i\) 行,二是从某一个开始断开,前面照常填,后面全填这个 \(j\),这是没有遗漏的,因为唯一的不能直接从某一个断开的就是前一行对这一行有贡献。其实这个本质上就是因为 \(+\) 和 \(\max\) 在整数上是构成向量空间的,那个转移就是乘一个矩阵,我的做法就是手动把矩阵乘开并直观理解。
下午洛谷月赛差点 AK 了,写完 D 剩一个小时居然没调出来,D 的做法是很直观的,大概思路很快就想到了,但是下午晕晕的,写了很久,后面到比赛结束前也没调出来。赛后调了调就过了,对于要删除一个子树中所有的操作我居然没有递归的删下去,也没有把已经删过的去掉,而是只把顶上一层给删了,这也太蠢了些。不过这题开始写的时候就没有明确思路,犯错误似乎很合理。以后写代码对于总体上的各个部分一定要明确。
12.30
CF1919E 卡题了。题解的思路十分的巧妙,但是这题按常规思路 dp 也是可以做的。感觉我的 dp 能力比较弱。
-
官方题解做法:考虑按另一个顺序去生成移动序列,这其实是个比较常规的思想。具体地直观上了来看就是先放一条从起点一直走到最大再到终点的路径,这样肯定是不会超过限制的,然后按需要把原来直的前后扭一下(向后走一步在走回来),或者把扭过的再扭得长一点,显然任何路径都可以这样扭出来,然后从大到小开始扭相应次并满足限制,每次看可以扭在什么位置算一算就好了。
-
dp 做法:其实 dp 本质上也是找一个新的方法去生成这个序列。想 dp 的时候难点在于,要满足次数的限制肯定是要在值域上做 dp 的,但是每个值在序列里又是分散开的。注意到这个路径中的每一段都是在一个区间里走,所以从大到小考虑每个值时,它们其实构成了一些段在之后合并,而合并的时候必须是小的在最外面才可以合并。所以可以设计 \(f(i, j, 0/1, 0/1)\) 的状态表示后面 \(i\) 个形成了 \(j\) 段左边 是/不是 \(i\),右边 是/不是 \(i\) 的段的数量,这样就好表示和合并了。
12.31
早上想了个题。然后中午的时候看见失物招领处散落的校园卡,就突发奇想做个校园卡找回系统,志愿者对散落校园卡拍照,系统自动识别失主,失主可以在网站上查询或者登记自己的联系方式,等有人捡到系统给他发邮件。晚上说干就干,新年到来之前就写完了。于是没写其他题了 /ww。
1.1
在嘉禾苑采集失散校园卡信息的时候发现了个认识的,算是该系统上线后帮到的第一个同学,不过之后可能帮不到了,因为根本没人用,就算有人用也是丢了卡以后,谁闲着没事去拍照啊。但这个不属于技术问题,就不管了,就当是写着玩吧。
今天状态不佳,昨天开的题想了好久才发现很签到。然后开了个新题又卡题了。
1.2
卡的题(CF1895F)看了题解,觉得很简单啊……这个问题看上去很困难,直接做没有什么思路,我的想法是先找到一个靠谱的表示,然后再优化,所以就开始观察暴力 dp 有没有啥性质,能不能只在 \(x\) 范围内做,但是啥也观察不出来。实际上这个思考的方向是挺对的。但是找靠谱的表示的时候虽然想过反着来,但是居然没有注意到反着来有显然的一项限制在 \([0, x)\) 范围之内,另外两项减一减的结果也是显然的,因为两段很多都只是平移了下,是本质相同的。注意到这个就很好做了。这题只是个纸老虎。
越是走得深,走得远,就越是能体会到智力活动无与伦比的乐趣。他们飞得那么高,那么远,不是因为他们脚底没有能驻足的地方,而是因为他们看到了星辰。
下午感觉思维很乱,什么都理不清楚,想了好久想了个假做法,有点心态崩了,感觉不想在做了,于是去写高数去了。算法和数学一样,你会遇到很多的困难,当你遇到困难的时候,不必焦躁,只要静下心来慢慢想清楚一切,困难就会变成静谧的幸福。不必怀疑出发的意义,因为此刻的思考就是我想要的。
扯这些是因为,今天啥题都没做出。
下午想的一个题 CF1893D 其实大概方向也挺对的,拆了每段,但是以排成一排的视角看,没有以一段单独的视角看(这句说了个什么,明天我自己看恐怕都不知道了)。首先要意识到,一段里面不同调一调顺序会变成充分的,然后考虑怎么贪心去把每段做出来。感觉这种贪心对上脑电波的题一定要各个视角都看一看,才能找到一个正确的方向去证明。这题的证明思路也挺巧妙的,即如果存在解,每次往现在最大的块里放一定能构造解,因为如果把某个放小的有解,那么,之后大的里一定有小的里没有出现过的,把放小的里面那个换成这个没出现的,一定也是合法的。这个证明看上去不难想,但是感觉挺有技术含量,因为得意识到是在哪个状态下一个更大,所以后面一定有在那个状态下小的的没出现过的,而不是开始状态怎样怎样。
然后,甚至还可以发现,把段放进颜色里和颜色放进段里是对称的,这样就可以方便实现。不必构造出来分配再调整。
1.3
早上醒来之后想了下,昨天那题其实非常的显然,题解的接近思路应该是为了比较严谨的说明。直接每个暑假里面要一段一段不同的塞进去,那肯定是要先塞现存大的,这样后面每刻的“一个面”,即剩下的不同组数都是最优的,如果有另外的解,这样肯定也是一个解。而且这样塞的时候直接可以构造出解,不用再后面排序什么了。
为了改掉抓头发把自己抓秃的趋势,今天戴了个帽子,不能抓了,不知道和思维能力下降有没有什么关系(大雾),早上计算物理课一个都没有想出来。
下午下课后仔细想了个题,感觉还挺有趣的,发现性质,设计一个基础 dp,然后发现可以状压优化一下,但是实现能力似乎也变差了,几行代码写了特别久,还是晚上考完试回来才过的。
明天是 Hello 2025,能不能开出 F 呢?
1.4
没有 F,但是 E2 挺快,刷新了 rated 比赛个人最高 perf.,上了七十多分,距离 IM 只差 43 了!
G 是个神秘构造题,榜上好多人秒了 /xk
1.5
感觉神秘构造还是挺可做的,在密铺上修改的思路是比较直接的,只是五种方式构造出来的代价和就是 \(s + p\) 不是很好观观察。要是过了这个就 perf 2800 了,赶上漏报了/ww
晚上实现了昨天下午想的前面几场的 F,*2700,调了好久才过,看了一眼题解发现居然踩标算了(
2700 也就这样啊,再做一周 2600 应该可以去上 2700 了。
1.8
最近三天怎么状态变差了,似乎很难机灵地观察处性质来,尽管看了好久后或看了题解后发现性质都是挺简单而符合直觉的。
算上洛谷,上个月通过超过 83 了,即按这个速率计算,一年通过量超过 1000,总算是达到哥哥说的训练门槛了,寒假加把劲,冲一冲月通过 120。
1.9
早上很快想了一题,1799G,但是假了,其实这种问题容斥应该是典型思路,但我开始想了一种前面填的时候预留给后面补上的 dp 思路。这个思路的问题在于在这题中,每个颜色的每个是不同的,状态里没有存储足够的信息可以算后面往前填的方案数,本质上是把一个颜色剩下来不同的都混在了一个状态中,这样多重集计数时没法除以一个阶乘去重,而钦定每个有多少个选自己的,剩下来就是明明白白的,不会有这个问题。
感觉现在的问题在于,对于候选的做法考虑不够细致,总是画了个大概就去写就去调,发现假了就投降。正确的做法应该是细致考虑每个做法,发现假了也应该考虑原因并据此对这个问题建立更多的直觉,积极回退到之前的路径,最终解决问题。
1.13
很奇怪,感觉我的学习会进入这样一种状态,明明一直在积极地思考和练习,但状态却变差了,甚至原先能轻松解决的问题也变得相当困难。我现在似乎正面临这样一种情况。原来一天爆杀六个 2600 的状态消失不见,而是做得非常艰难,总是观察不出合适的性质,或者不能考虑到所有的性质来设计合适的做法。之前高中停课也是这样,两个月之后状态全无,高中学文化课也是这样,在一模以后的状态越来越差,难以集中注意力去思考什么,一直到高考。
我不明白这是为什么,但看上去这可能是某段必经的道路,我必须得挺过它,去积极地思考,积极地去训练,积极地去探索。而不要感到恐慌,不要不作为直到最后,不要重蹈之前的覆辙。当然,也不要给自己太大的压力。知乎上看到已知的分子机制表明在压力较大的时候大脑会抑制高级认知功能,或许训练到一定阶段总是回失去耐心,操之过急,进入这个状态。
幸运的是,今天似乎走出了这个状态,下午考完思政后做了两个题都挺顺利的,期末周不该准备考试吗 希望之后能找回更好的状态,度过难关。
寒假
前面几天的状态不错,虽然慢些但都能做出来,寒假好好加训!
1.29
半个月过去了,感觉……真的在复刻当年停课啊。
jyy 指出,算法竞赛是数学竞赛和社区竞赛,要成为高水平的选手,需要很强的数学推理能力,并跟上流行的技巧。感觉我两项都不咋符合啊。。。“大多数选手都是倒在了刷题看题解的这一步”要么提升推理能力,完善推理工具箱,要么只能离开算法竞赛。在接下来的一段时间,我会尝试在这里复盘做过的题的思维链,看看问题出在哪里。至于流行的技巧,我现在比赛的训练量也是不够的,应该加入更多的 vp。
- 2013F1
昨天在这题上花费了非常久的时间,写了个假做法并修修补补,得到了修补后的假做法。经常出现这样的事情搞得我要心态爆炸了,感觉有一段时间状态好恐怕只是题多了,直觉变好了,但推理验证少了,大力猜凑巧猜对了。复盘:玩了几个样例之后我想了下常规的博弈在图上走的思路,觉得这个状态空间好大,不好这样做。然后做了一个大概的观察,两条路径只会影响一次,然后就进行了一个没有道理的断言,认为可以把问题转化成,在一个点下 Bob 随便走,Alice 抢到一个下面随便走还是会输的点就行。但是并非如此,Alice 和 Bob 并不是在一开始就定好了往哪里走,它们可以在途中看对方的走法改变自己的路线,不难构造这样的反例。今天重新做的时候感觉到问题出在这并不是“只会相交一次”的正确转换,“只相交一次”比较精确的表述是在两者相连的路径上,一个一旦离开这条路,就成了两者分别走到最深的点看谁能走的远。这个问题就好做了。正巧前几天 lca 在讲问题的表示,这个错误就是出在没有正确地表示性质,而是靠一个大概的想法进行了猜测,并没有进行细致的验证。
虽然昨天假了很久,但是今天挺快就想到了,所以我还是想说,有的 *2700 也就这样。(狗头)
1.30
- 2009G3
复盘:首先进行了显然的转换,将问题转换成对区间求“每个数加它作为最小数的区间次的和”,然后陷入了困难,将贡献拆开认为这个东西有取了 \(\max\) 与取了 \(\min\) 乘起来的项,因而不可做。但是这样丢了性质。既然已经知道了只有这一项不可做,那么一个很自然的想法就是这一项会不会数量是很少的。其实挺显然的,这一项,即区间最小值,只会有一个,然后就做出来了。
1.31
啥也没干,把一个之前过了 easy version 的 hard version 转换成简单版本,过了个题。
2.1
-
[COCI 2024/2025 #4] Xor
这题做得太慢了。复盘:大体上的思路是很正的,就是要找每一位出现了几次 \(1\),也就是要找两个数相加这一位是 \(1\) 的条件。尝试固定一个,找可行的另一个。然后我开始逐位地考虑这些位应该具有怎样的特征,并把它们放到 trie 树上解决,这样是大常数两个 \(\log\) 做法。我觉得过不了 5e5 就没写。然后发现后面的位进上来最多进一个,按这一位一不一样分开,然后找到和大于 \(2^i\) 的就可以了。进上来最多一个的想法之前也有,不过当时考虑到这一位的影响感觉非常混乱就没有想到直接上。或许遇到性质的时候要考虑不适用的原因。另一个问题是,找和大的开始用了二分,然后 T 了,以及 \(30\) 位没有考虑 WA 了一次。优化要彻底,这种有序的显然可以直接双指针。以及考虑上界的时候得考虑运算中途。这两个问题第二天又让我多调了一个小时 -
CF1997F
复盘:很快就发现了问题是用 fib 凑数,但是居然认为那个 dp 转移要枚举取了几个,所幸后来认为不可能有其它做法(因为和 NPC 等价了 /ww)回来发现这个背包根本不用每次枚举取了几个。这个就单纯对这个 dp 不熟??不过计算理论的意识到是促进我迷途知返(笑)。
2.2
- 1995E1
复盘:这题的转换非常顺利,一下子就意识到那个依赖连续的两个就相当于一条边,要构成一个环。但是居然完美复刻了前面 xor 遇到的问题,一个是无穷值开小了,因为那个无穷的目的是减了一个值后要还是无穷,所以得开到最大值的两倍以后更改一下代码习惯,写到 INF 的时候就考虑设置和更新 INF 的值,而不是最后再写。一个是优化不彻底,明显可以直接 dp 过程中求出最小值的硬上了个二分,这种 dp 值是 0/1 的就该注意多带点信息。
2.3
- 1993E
这题乍一看蛮奇特的,但并不难。复盘:首先看到数据范围只有 \(15\),可能是比较暴力的做法,而且异或和差的绝对值似乎没有什么关系,就考虑这异或能把一行变成什么样,看是不是能缩减一点搜索范围。手玩了一下发现是等于把上一个覆盖的填到下一个里面去,即相当于多了一列用于暂存,每次操作是选一个和那一列交换,那一列原来是整行的异或值。执行若干次交换显然能到达所有的排列。所以问题转换成了多出一行一列,进行行和列的排列能达成的最小相邻差之和,由于是整行整列换,一个方向上的差不影响另一个方向,所以分开 dp 就好了。思路还蛮顺的。但是写的时候犯了个错误,行列并非完全独立,dp 的时候要把另一个维度去掉的给去掉。这个问题从整体来看感觉挺容易发现的。想的时候应该对问题的全局要有一个多角度的、整体的把握,比如这题显然去掉的行对列的答案和策略有影响。这样便于及时发现问题。
2.4
- 1991G
和前题一样良好的体验,看上去不可做,但是细致地推理一下发现是简单的。复盘:在手玩探索的时候逐渐意识到了下边右边摆满,然后在左上相应位置放的思路。但是实现的时候没有仔细考虑实现方式,导致交了一堆 WA on 2,开始以为实现可以不模拟,只计一下下个要放的位置。这一步没有仔细考量,其实情况是非常复杂的,并非一个个往后放,所以要模拟那个过程。确实,现在做题主要重视推理,而忽略了考虑实现方法,半场开香槟了。以后一定要仔细考虑到实现为止。
2.5
晚上开了个题,想了好久没有什么进展 /yun
2.6
- 1956E2
睡觉的时候仔细考虑了下手玩的直觉,发现了所谓“增长很快”指的是在较少的步数内就能缩小到非常小的规模,并给出了合适的上界估计,于是起来会了。复盘:开始时在考虑一个经过多次操作的时候犯了一个错误,没有把前一次这个的改变算进去,好在这样得出的结论很反直觉,于是发现了这个错误。然后简化到链的情况先做,这种高维前缀和形式的,显然是乘了一个组合数的系数和正负的系数,但是有正有负,一下子没反应过来怎样对“增长速度很快”的直觉进行准确的表述。睡觉的时候想到没有办法正确表述是因为没有好好地利用“前面都没有减到 0” 这条性质,于是逐个考虑,很快就发现了是每个等差数列乘上了一个操作次数,于是问题很快就缩小到了很小的规模。但是在实现时犯了几个很低级的错误,包括找非零区间时左闭右开左闭右闭搞混,等差数列求和求错,没意识到 \(4\) 的情况能简单判断。这种情况感觉很怪,归因给“不仔细”“写题的时候没有足够的专注”好像都没有什么意义,所能做的或许是写题的时候尽量保持严肃和专注?
晚上开了个新题,挺快想到了做法,但是感觉写起来挺长,不想写了。/ww
2.7
昨天那题搞了个实现比较长的非预期解,后来看了题解发现了有很多短一些的做法。不过写了那么大一堆,似乎有点细节的,最后正常工作过了此题,还是挺舒服的。
- CF1942F
复盘:很快注意到了递推的方式,且修改的影响很快就会衰减到 \(1\),所以先把变化不为 \(1\) 的暴力做了,然后维护变化为 \(1\) 的连续段,大力用个 set 用个树状数组维护就做完了。这个思路上倒是没有什么问题,写起来其实逻辑也不是很复杂,但是太长了,赛时根本写不完。官方题解的做法是这样的:发现衰减很快,最多 \(6\) 个影响就降到 \(1\),所以把连续的六个变成一组,一组的最后一个只有两个取值,可以求出分界线,然后就变得好维护了,可以用线段树或分块在上面维护。为什么我没有想到这个更优雅的做法呢?我在发现影响衰减到 \(1\) 的时候就停止了,没有继续得出更强的结论,无论前一段怎样,一段的末尾只有两个取值,即把前一段的末尾也看成一种加。遇到难写的不妨再看看性质有没有利用干净。
2.8
-
CF1930F
复盘:前面几步非常正确的完成了转换。居然到最后一步没发现直接做复杂度就是对的,笑哭了。一点出发把图染黑不是传递闭包啊,直接做当然就是线性的。 -
CF1924D
复盘:注意到所谓最长的合法序列就是把一个合法序列切除若干个合法序列,放进剩下的右括号全在左边,左括号全在右边组成的括号序列中,但是要 dp 将 \(k\) 组括号分成 \(j\) 个在 \(n^2\) 内是做不了的,在这一步犹豫了很久,没有果断放弃这个思路。然后退回去找不到可以走的路就投降了。问题在于没有想到这个问题讨论第一个直接就是一个递归的形式,然后可以发现把问题定义为小于等于 \(k\) 就可以获得很好的边界情况,并直接归纳出组合式子,这个妙啊。
2.10
- CF1924D
复盘:一开始毫无思路,后来想到序列中所有数都能被表示成两个的和,这样一来就是要构造一些尽量一段能自己表示自己的,再把这个问题加强成一段以内全都可以表示,很快就发现 \([1, n, 2, n - 1, ...]\) 这样的构造再调整一下正负号就构造出了偶数的情况。然后考虑奇数,发现能够随便填的都在偶数位,那么奇数位尽量少留一点要产生的或许可以,稍作调整找到了偶数位只留下两个最大的拼不出,多拼出了一个 \(-1\) 的构造,然后一直拼拼不出的,最后用两个可以任意调整的拼出两个拼不出的就可以了。但是!这样一直拼是指数增长的!尝试调整就是要找序列本身能被相邻一加拼成的,这个感觉做不到,至少要多出来一些。然后又不会了。然后尝试回退回去也找不到其它思路。其实尽量表示自己的不一定是要全限制在一个空间里面,其实由 \([a, b, ...]\) 开始就可以继续构造 \([a, b, -b, a - b]\) 这样接下去。感觉没有想到这个的原因在于没有仔细回溯其它方向(发觉不对回溯的时候否决掉之前的路线后应该想到自己能表示自己的段可能不止是一段全拼出来),以及没有仔细分析问题中数据的规模,没有及时发现这个是指数增长。还有就是没有能力坚持更快更长的思考了,要多想。
感觉推理的工具远远不够完善,先不说思考的长度有限,很多问题做不出是没有实时找到可靠的路和一些靠谱的性质推导,和没有分析每一步能做或不能做的原因获得更多启示。当然思考的速度和长度这种推理的“身体素质”也不够,寒假摆了,下学期得好好加训了。
25 年春季学期
2.19
寒假的最后几天做了点其它有趣的事情,然后就开学了。
现在真的进入了一个很奇怪的状态,许多简单的问题需要长考很久,没有养成细致地发现性质和仔细推理的思维方式,在寒假的某些时候有这样的感觉,但总体上讲还是摸黑瞎找,上学后的很多题目都是这样的情况。要改变思维方式是很困难的,希望现在能坚持住,每天多加推理时间,老老实实地去进行推理分析。
今天 vp 了寒假里的一场 div1,好家伙,题题命中我的弱点啊,A 题就长考 40min,B 甚至不会了。
复盘一下
-
CF2066A
这题的关键点其实很简单,基本思路就是考虑假设是一个,有怎样的特质,比如一个没有出度的点在图上肯定到不了任何点。所有点都有出度的话,曼哈顿距离限制最小值,图上有最大值限制,只有一个值可能都取到,这就很好做了。场上开始时凭直觉试了正反取,询问 \(x\) 中的极值,然后一直在里面绕圈子 ,没有细致看性质。 -
CF2066B
这题的问题在于,没有把基本的性质发掘完,而且顺着一个思路长考了很久了直觉上也感觉做不出了也没有放手去挖性质,这个问题上学期有几题上做得不错,虽然卡在一个思路了,又觉得这思路很有道理,但把性质摘干净了及时去找了其它性质。
2.20
下午脑子非常糊涂,应该遇到困难睡大觉的。
补了下 CF2064F。复盘:这题仍然是没有挖掘完已经发现的性质,首先我很快就发现了那个式子是显然单调的,然后利用单调性设计了一个 \(n^2\) 的算法,就没有什么进展了。而单调意味着恰好为 \(k\) 的和的两项都是唯一的,可以考虑每个 \(a_i\) 作出的贡献,后面的思路就很普通了。此外这题实现起来比想象中的容易。
2.21
今天补了下 CF2066C 居然还是没有做出来,那个 dp 一维很大就直接被我丢弃了,但是每次要修改的显然很少啊。/yun
2.22
UCup Final! 当然不是我在参加(
看了下直播,发现了个原神选手 /ww 发现全世界人都在 deepseek /ww
晚上补了一个题。
2.23
-
CF1916H2
在这题上不敌 deepseek 了,因为 deepseek 线代学的很好,它知道公式 /lb。复盘:这题当是在返校的路上想了一下,得到了基的两部分拼起来是两两不同的,即 \(r\) 维的空间大小是 \(p^r\)。但是怎么计算有多少个不同空间,和怎样在一个空间里面选出秩没有变小的 \(n\) 个不同向量就不知道了。我没有想到每次加入一个就可以直接计算 不同的基数目和一个空间可以取出的基数目,而是在想从每个空间包含的向量数和重叠的向量数算出空间数。此外,取出没有变小的 \(n\) 个不同向量等价于取出 \(n\) 个秩为 \(r\) 的 \(r\) 维向量,再由行秩等于列秩转换为 \(r\) 个 \(n\) 维向量也没有想到。对于第一个问题,改进要在一个表示遇到困难时想问题的各种表示,对于第二个问题,要选取正确的表示,即 没有变小 的数学表示是排成一个 \(r \times n\) 的秩为 \(r\) 的矩阵。 -
补了前面 vp 的一个 div2 的 F,感觉思路还是挺简单的,代码写起来也比想象的简单,虽然只有不到 100 人过。
2.24
中午的时候开了一个 2700, 1867F 但是没多想,晚上想了下发现挺简单的,原先以为实现上会有点困难,但写完发现写起来也很简单,几乎是一遍过,wa 了一遍是因为对增长的界估错了,用 cayley 定理算的是有标号的,而这里是无标号的。这样看来我的问题甚至是在代码能力比较弱,不能很好的表达想法?多写,多想。
2.25
中午的时候开了个 2700,结果发现非常简单,虽然一开始忽略了一个细节卡了一会儿,但一下子就修掉了。于是在电磁学教室里过题。(jiangly: 上课不带电脑干什么 /ww)
晚上这题挺神奇啊,首先很快转换成了一个完全背包形式,然后发觉复杂度不对,于是认为不可做。看数据范围是 \(10^6\) 于是觉得根号也不行,就放弃了。一看题解复杂度带 \(\omega\),但是感觉还是很不对,然后一桶推断发现经过一些简单处理复杂度就对了。
记录下这个技巧:一棵树上每个点需要做一个 01 背包,值域是边数,物品个数是儿子数。首先保证了和,根据经典结论,最多 \(\sqrt n\) 级别的不同,变成多重背包问题。看上去复杂度 \(n \sqrt n \log n\),但是按照每个分割出来的 \(2^j\) 来看,因为限定了和,只有 \(\sqrt{\frac{n}{2^j}}\) 个,这玩意儿加起来肯定是 \(n\) 级别的。但是这样还是不对,因为每个点要做一遍,这只考虑了一层的最坏情况。注意到若一个点上超过一半就可以直接做,我们仿照这个保证复杂度的思路,就会发现每次缩减了一半,加起来还是原来的级别,这就对了。
然后这个巧用 template
的用 bitset
的写法也挺有意思。我还想了下在原神里能不能这样偷懒(不考虑 crate 提供的 bitset,定长数组模拟),playground 里试了一下常量泛型,编译错误了。第二天才想到 rust 里那个又不是模板,模板的对应物(这种问题里)应该是宏,直接用宏生成 20 段代码就可以用同样的原理实现了。
2.27
今晚注意力挺集中啊 CF1849F,不久就观察出了性质,发现很简单,写起来也很简单。题解区都是啥啊 /yun 大家都很懂图论 /xk,然而啥都不需要直接做就行了 /xk。
2.28
晚上 vp 了昨天的 edu,很遗憾地没有出 E,前面几题倒是写得挺快。
复盘一下:首先是想到这个很可能和最后一步是谁做有点关系,这样就可以把两个输的条件中的一个判掉。但是在这一步错了,居然误以为长度除以二是偶数时要全是 \(0\) 才能先手赢。这个显然不对。然后再另一种情况上转了一大圈回来发现这个假了,重新想,发现 \(c_0 \ge 3c_1 + 2\) 这个必要条件显然可以归纳证明充分。然后拓展到另一种情况不过是在这之后多了几个,减掉后变成 \(c_0 \ge 3c_1 - 1\) 就行了。然后关于前缀和怎样减出来是 \(\lfloor \frac{l}{2} \rfloor\) 为奇为偶搞错了好久。感觉晚上确实状态不是很好。
2.29
晚上 vp 了昨天的 div2,这场怎么题题诈骗啊……关键是还题题都把我给骗到了。
要复盘一下的话首先 B 题随便猜了个结论压根没证就上了,外带一个没开 long long
于是错了两发,C 直接在图上瞎搞,一点没考虑一下简化,后来想了下链和菊花的情况很快就出来了,虽然这两种情况都是显然的。D 一开始读错了题目,其实 D2 的思路和 D1 是如出一辙的,而且非常自然,不过实现的时候后面太急了,搞错了很多东西,以至于不但生死时速失败,赛后还调了很久。做什么题都要踏踏实实,不要硬猜和瞎搞,以及什么时候都要写对的代码。一个 unix 哲学:有时只需要做对。(大雾)
3.8
这几天确实没练多少。昨天打 hdu 春赛表现也挺糟糕的。今天一个挺简单的构造中一种方法能构造出的只概括了一半,又没想出来。
加训。加训。
3.10
早上看了一个题,先进行了几个显然的转化转化成了一堆向量选出一些要求走得最远,然后早八想了一节课就没有思路了。后面英语课的时候突然想到确定一个方向然后求在上面的投影正的就取上,这个条件等价与取 90 度内所有的向量,于是就做完了。然而晚上实现的时候懵了,计算几何经验匮乏 /xk 然后换了一个假的写法,认为取 90 度内所有等价于一个开始一直取增的(那个方向投影是增的,而不是所有方向单增)调了好久,看了个题解做法发现超优雅,先把一半的加入,然后再把反向的加入,就等价于是先减掉相应的,再加新的了。
启示大概是要一个一个性质慢慢想,以及多想有趣的实现,这也是算法竞赛的魅力之一。
此外得知了一个很牛的性质:闵科夫斯基和对应的凸包的边完全有原来的凸包的边平移而成,所以这题还可以直接枚举 \(2n\) 个凸包的端点。
3.11
做了一个题要在线段树分治后求有到达时刻的点,我在并查集里加了个链表,记录没到过的,每次合并的时候接上,分开的时候退回去,下面用过了就清空,然后折腾了好一会儿发现直接清空所有复杂度是不对的,遂做了个标记在合并的时候清空。然后过了。但是看了题解发现都打懒标记了干嘛不直接打是否可以到达的懒标记呢,分开的时候下放标记。其实这题是标准的可以做懒标记的形式,因为一个要被标记的集合有非常简单的分裂,想想看,线段树也是因为这个性质适合打懒标记。
3.12
又双叒叕被 div1 B 爆杀了,其实这题很简单,既然加里面肯定没有性质,并且操作完全和去除一些位后的和等价,那么可以做的事情就不多了。二进制和很显然的性质就是最多进一位,那么每次隔一位保留就知道哪一位上发生了进位了。
3.13
早上开了个题 1804F,首先在光学课上怀疑了一下无向图做类似树上的那个找直径对不对。然后写了个光学作业,到热学课的时候想到这不是纯纯签到吗,找直径既然已经 O(n) 然后加边直径又是递减,要求误差又是一半以内都可以,直接二分每次 log 最多 log 次,1e5 应该轻轻松松,更何况可能还可以乘个 1/2 的常数。
晚上去上了个小班,主要是学长回复我逃课请求时说“原则上不可以”,然后去了后发现说可以不去(雾),上一次上晚自习还是 6 月 8 号。于是坐在那里想 1799F,然而没有什么思路。回来之后固定了几个性质推了推发现纯纯签到,写完之后没怎么调一遍过了,舒服。
感觉现在的体验就是要多固定性质,有很多东西我都是可以做的。明天 hdu 春赛争取多几个题,照出题人的说法(出题人的说法不该自古低估难度吗?)最多是银牌题,那么其实全都可做(雾)。
3.14
今夜是个神奇的晚上,居然杭电春赛 rk11!
原来,只有几个人过的题,并发不可做吗?
这下重拾对算法竞赛的信心了。
不过决胜的那题确实不难,一步步慢慢观察性质就出来了,开始直接看上去不可做,但是一步步分解开,一步步发现性质,也就那样,挺签到的。
3.18
3.13 那个我胡说八道,两次 bfs 根本不能求图直径。被 ds 骗了,我也是太蠢了,居然在自己想不明白的情况下去强行相信 ds 的所谓证明。
不过那题蛮有意思的,虽然不能求,但是在两倍这个区间内一定对啊。
3.22
晚上那个 2700 真的是,所有部分都想到了,就差那一步。感觉是对知道的性质表述的不够充分严密,只想着“次数多了某一段近一点”,没有仔细表述出多近,这个 \(k \ge 5\) 甚至是一开始就想到的思路。而且也没想 \(80\) 过 \(n^5\),其实这个完全跑不满确实应该过。
这些日子算法竞赛上似乎又懈怠了,现在又变成了好多想做但是啥都没做了,还是要做减法,先保证训练时间,保证做出点什么来。
不过今天又遇上 cph 出 bug 了(疑似),这下真有充分理由去读源码把它修一修了(原来想加直接运行不编译,但是在去掉万能头的情况下其实编译速度挺快的)。这样事情又多了一样(笑)。不过那么工程化组织的这样一个小小的项目也会出 bug 吗,真就没测过的代码都是错的。
重启
4.14
停了快一个月了,之前的训练量也越来越趋近于 \(0\),这期间折腾了一些奇怪的东西。现在想想,还是专注在少数感兴趣的方向走得远些更有趣。所以该重启训练了,至少晚上得保证个三四个小时给算法竞赛的训练。
昨天开了个 \(2700\),今天晚上想出来了,不过实现上还是略显生疏,没能写出来,明天写。
4.17
这玩意儿居然写了三个晚上才最终调出来了,确实一开始想得不清楚,在树上跳的很多情况没有考虑到。而且最近训练少了,代码能力可能确实变差了些。另外千万级的 vector push pop 是要 T 的。
4.18
杭电春赛开局状态不错,看的第一题一开始想了个假做法(最大生成基环树森林不等于最大生成树加一条边),但是仔细考虑了下其中的过程就修正了,虽然不能直接最大生成树,但是贪心的证明几乎没有被破坏,用类似的方法做就好了。成为了第二个过这题的同学,可惜没有一血。
后面中规中矩写了三个题,还有个题写完来不及调了,感觉代码写得确实慢了。不过最后居然还有 rk34,那看上去倒不错。
4.19
好屈辱的一天啊,天梯赛打铁了。谁和我说可以倒开来着,我真倒开了,然后发现最后一题不会,倒数第二题挺简单但是卡常(400ms?O(n) 过不了 /xk),然后开始做前面回天乏术。最后!得知!天梯赛倒开不得分的,必须正向做题,或者整个 A 穿!
晚上 CF 继续下分了,居然没回 cm 也是个奇迹。其实 D 很一眼啊,E 看上去应该也很简单,D 太慢了 E 没出。
4.21
做了 E,确实很一眼。
4.23
体育课的时候开了一个 2700,1750F,觉得要是能行肯定存在一个每次只覆盖一段白的方案,但是体育课上比较脑抽,一下想不出这个性质的证明。
晚上一看这个性质是显然的,然后就容易想到先把黑块的状态定下来,确保中间没有任何可以操作的。写出 dp 方程,再观察一下发现每次加的是一个三角形,水到渠成地就做完了,不过 dp 的含义在写的时候有点搞混了,调了好久。现在做题确实生疏,没能写之前都想清楚,这题其实很简单啊,感觉完全不到 2700。
不过反过来说,总算是又能做 2700 了/doge。