AtCoder Beginner Contest 287

纯纯手速场

遗憾离场

C

首先这张图必须是一棵树,必有 M=N1

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

Code

D

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

那么 x 符合条件的充要条件是 xA|T|xB,于是就做完了。

Code

E

Trie 树板子题,真的不知道咋说,OI Wiki 上就有

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

Code

F

f(u,j),g(u,j) 分别表示:以 u 为根的子树,选/不选 u 时,得到 j 个连通块的方案数。

  • 如果不选 uu 的各个子树互相独立,因此只需枚举每个儿子做卷积,即 g(u,j)×(g(v,k)+f(v,k))g(u,k+j)
  • 如果选了 u,考虑 u 的某个儿子 v,如果同样选了 v 那么连通块个数需要 1,否则不变。因此有 f(u,j)×g(v,k)f(u,j+k),f(u,j)×f(v,k)f(u,j+k1)

根据树形背包的经典结论,每两个点只会在 LCA 处贡献一次,总的复杂度为 O(n2)

Code

G

显然对于一次询问,我们应该取出前 x 大进行求和。

考虑设 c[i]=j=1n[aj=i]bj,即所有 scorei 的类型的 card 的上限之和。

用线段树维护序列 c,每个节点维护区间内 c 的和与 i×c[i] 的和;若要选 x 个数,在线段树上二分,看右儿子区间内 c 的和是否 x,如果是则递归进右子树,否则递归进左子树并加上右子树的 i×c[i]

离散化一下,总的时间复杂度为 O((N+Q)log(N+Q))

Code

Ex

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

使用 bitset 优化传递闭包,复杂度 O(N3w+NQ)

Code

posted @   云浅知处  阅读(205)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示