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\) 永远紧贴着分界线左面,于是答案就是:
F
发现切了 E 之后还有时间,于是去看了 F,然而被硬控半小时。
距离比赛结束 \(20min\) 时想到如下做法:
断环成链,发现两个线段有交点,当且仅当它们在链上对应的区间是有交集且不包含的。题中所给的 \(M\) 条线段没有交点,说明它们要么无交,要么包含。
所以可以对线段建树,并赋予一个虚根 \([0,2N]\),求出覆盖链上每个位置的深度最大的节点。每次询问,查询到左右端点对应的节点 \(u\)、\(v\),令深度为 \(dep\),则答案为:
然而此时只剩下 \(20min\) 了,neatisaac 意识到自己无法写出来建树、查询和树剖 LCA 的代码。
于是继续深度思考,突然灵光一闪:
我们并不关心 \(u\)、\(v\)、\(lca(u,v)\) 的编号到底是多少,我们只关心它们的深度。而如果令根节点的深度为 \(0\),那么一个位置所在节点的深度,就是它被覆盖的次数。而询问区间的 \(lca\) 的深度,就是区间内被覆盖次数的最小值。
于是可以使用差分和前缀和处理出覆盖每个位置的区间个数,再用线段树求出来区间最小值,就能得到答案。
此时距离比赛结束只剩下了 \(10min\),\(\color{grey}neatisaac\) 用 \(5min\) 写完了代码。
但是没有过样例!
因为没有求前缀和。
最终,\(\color{grey}neatisaac\) 通过了这道题。
后记
perf 来到了 \(\color{blue}1652\),然而并没有加很多 rating。

浙公网安备 33010602011771号