AtCoder Beginner Contest 287

纯纯手速场

遗憾离场

C

首先这张图必须是一棵树,必有 \(M=N-1\)

接下来只需求出树的直径,判断其长度(边数)是否为 \(N-1\) 即可。

Code

D

考虑算出来 \(A,B\) 表示 \(S,T\) 的最长公共前缀/后缀的长度,这个可以直接线性算出。

那么 \(x\) 符合条件的充要条件是 \(x\le A\)\(|T|-x\le B\),于是就做完了。

Code

E

\(\text{Trie}\) 树板子题,真的不知道咋说,OI Wiki 上就有

可以参考:https://www.cnblogs.com/YunQianQwQ/articles/16054560.html

Code

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)\)

Code

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))\)

Code

Ex

考虑 Floyd,从小到大加点,每加一个点就扫一遍每个询问更新答案

使用 bitset 优化传递闭包,复杂度 \(O(\frac{N^3}{w}+NQ)\)

Code

posted @ 2023-01-28 21:42  云浅知处  阅读(196)  评论(0编辑  收藏  举报