AtCoder Beginner Contest 287
纯纯手速场
遗憾离场
C
首先这张图必须是一棵树,必有 \(M=N-1\)。
接下来只需求出树的直径,判断其长度(边数)是否为 \(N-1\) 即可。
D
考虑算出来 \(A,B\) 表示 \(S,T\) 的最长公共前缀/后缀的长度,这个可以直接线性算出。
那么 \(x\) 符合条件的充要条件是 \(x\le A\) 且 \(|T|-x\le B\),于是就做完了。
E
\(\text{Trie}\) 树板子题,真的不知道咋说,OI Wiki 上就有
可以参考:https://www.cnblogs.com/YunQianQwQ/articles/16054560.html
F
设 \(f(u,j),g(u,j)\) 分别表示:以 \(u\) 为根的子树,选/不选 \(u\) 时,得到 \(j\) 个连通块的方案数。
- 如果不选 \(u\),\(u\) 的各个子树互相独立,因此只需枚举每个儿子做卷积,即 \(g(u,j)\times (g(v,k)+f(v,k))\to g(u,k+j)\) 。
- 如果选了 \(u\),考虑 \(u\) 的某个儿子 \(v\),如果同样选了 \(v\) 那么连通块个数需要 \(-1\),否则不变。因此有 \(f(u,j)\times g(v,k)\to f(u,j+k),f(u,j)\times f(v,k)\to f(u,j+k-1)\)。
根据树形背包的经典结论,每两个点只会在 \(\text{LCA}\) 处贡献一次,总的复杂度为 \(O(n^2)\)。
G
显然对于一次询问,我们应该取出前 \(x\) 大进行求和。
考虑设 \(c[i]=\sum_{j=1}^n[a_j=i]b_j\),即所有 \(\text{score}\) 为 \(i\) 的类型的 card 的上限之和。
用线段树维护序列 \(c\),每个节点维护区间内 \(c\) 的和与 \(i\times c[i]\) 的和;若要选 \(x\) 个数,在线段树上二分,看右儿子区间内 \(c\) 的和是否 \(\ge x\),如果是则递归进右子树,否则递归进左子树并加上右子树的 \(\sum i\times c[i]\)。
离散化一下,总的时间复杂度为 \(O((N+Q)\log (N+Q))\)。
Ex
考虑 Floyd,从小到大加点,每加一个点就扫一遍每个询问更新答案
使用 bitset
优化传递闭包,复杂度 \(O(\frac{N^3}{w}+NQ)\)。