AtCoder Beginner Contest 405 比赛记录

前情提要

竞赛课上 \(I\color{red}nvinciblePeach\) 讲了组合数学。

正文

A B

C

吃了一发罚时,原因是缺省源数组开小了。

D

有个样例没过,发现 \(E\) 可能不止有一个。

直接从所有的 \(E\) 开始 BFS,找到一个未访问过的位置就把它的方向设置成当前位置到它的方向。

E

脑子抽了,推了半天组合数。

发现 \(A\) 的位置跟 \(B\) 无关,\(C\) 的位置跟 \(D\) 无关。于是先把所有的 \(B\) 堆到左面,\(D\) 堆到右面,可以确定一条 \(A\)\(C\) 的分界线,分界线左侧有所有的 \(A\) 和一部分 \(B\),右侧有剩下的 \(B\) 以及所有的 \(C\)\(D\)
枚举线左侧的 \(B\) 的个数 \(i\),让一个 \(A\) 永远紧贴着分界线左面,于是答案就是:

\[\large \sum_{i=0}^B{A-1+i\choose A-1}{B-i+C+D\choose C} \]

F

发现切了 E 之后还有时间,于是去看了 F,然而被硬控半小时。

距离比赛结束 \(20min\) 时想到如下做法:
断环成链,发现两个线段有交点,当且仅当它们在链上对应的区间是有交集且不包含的。题中所给的 \(M\) 条线段没有交点,说明它们要么无交,要么包含。
所以可以对线段建树,并赋予一个虚根 \([0,2N]\),求出覆盖链上每个位置的深度最大的节点。每次询问,查询到左右端点对应的节点 \(u\)\(v\),令深度为 \(dep\),则答案为:

\[\large dep_u+dep_v-2dep_{lca(u,v)} \]

然而此时只剩下 \(20min\) 了,neatisaac 意识到自己无法写出来建树、查询和树剖 LCA 的代码。

于是继续深度思考,突然灵光一闪:
我们并不关心 \(u\)\(v\)\(lca(u,v)\) 的编号到底是多少,我们只关心它们的深度。而如果令根节点的深度为 \(0\),那么一个位置所在节点的深度,就是它被覆盖的次数。而询问区间的 \(lca\) 的深度,就是区间内被覆盖次数的最小值。
于是可以使用差分和前缀和处理出覆盖每个位置的区间个数,再用线段树求出来区间最小值,就能得到答案。

此时距离比赛结束只剩下了 \(10min\)\(\color{grey}neatisaac\)\(5min\) 写完了代码。

但是没有过样例!

因为没有求前缀和。

最终,\(\color{grey}neatisaac\) 通过了这道题。

后记

perf 来到了 \(\color{blue}1652\),然而并没有加很多 rating。

posted @ 2025-05-10 22:57  整齐的艾萨克  阅读(209)  评论(2)    收藏  举报