AtCoder Beginner Contest 264 Solution

更好的阅读体验戳此进入

题面链接

题面 Luogu 链接

abcd 不说了

[ABC264E] Blackout 2

题面

ZK 国有 N 座城市和 M 座发电站,我们称城市和发电站为地点。

这些地点的标号为 1,2,,N+M,其中标号 1,2,,N 是城市,标号 N+1,N+2,,N+M 是发电站。

这个国家有 E 条能源传输线路。第 i 条线路双向连接地点 Ui 和地点 Vi。一个城市如果可以通过某些线路到达发电站,则称这个城市是有供电的。

现在有 Q 条询问。第 i(1iQ) 条询问,代表第 Xi 条线路停止工作,并且将来也无法修复。

每次询问后输出有供电的城市。

Solution

没什么可说的,比较显然,把询问离线然后倒着做,用并查集维护加边即可,经典套路。

Code

[ABC264F] Monochromatic Path

题面

给定一个 HW 列的 01 矩阵。你可以花费 Ri 将矩阵第 i 行进行 01 反转,可以花费 Cj 将矩阵第 j 列进行 01 反转。你需要最小化花费,并使得从 (1,1) 出发,只能向右或下走到达 (H,W) 至少有一条路径满足均为 01

Solution

首先不难想到每一行或一列最多进行一次反转操作,否则是无用的。发现只能向右或向下,则无后效性,故可以尝试 DP。

dp(i,j,0/1,0/1) 表示处理到第 ij 列,第 i 行和第 j 列是否反转的最小花费。

我们设当前状态为 dp(i,j,x,y),令 Gi,j 表示矩阵的元素,则对于向下走的下一步的转移比较显然:

dp(i,j,x,y)dp(i+1,j,0,y)Gi,jxy=Gi+1,jydp(i,j,x,y)+Ri+1dp(i+1,j,1,y)Gi,jxyGi+1,jy

对于向右走的下一步也同理可得。

初始值即为 dp(1,1,0,0)0,dp(1,1,1,0)R1,dp(1,1,0,1)C1,dp(1,1,1,1)R1+C1

最终答案即为 min{dp(H,W,x,y)}

Code

[ABC264G] String Fair

题面

给定 n 条评分规则,每条存在字符串 Ti 和得分 Pi。你需要构造一个任意长度但非空的字符串 S,在 S 中每次出现 Ti 就会获得 Pi 得分。你需要最大化得分,输出最大值。若无限大则输出 Infinity

Solution

一个十分精妙的图论。

关键的信息在 |Ti|3,这样的话我们就可以考虑进行建边。我们令 Pstr 表示字符串为 str 的时候的得分,如果没有该字符串的评分规则即为 0

于是考虑如对于从 ab 通过 c 可以有一条边到 bc,边权即为 Pabc+Pbc+Pc。同时注意一些细节,如从空字符串可以通过任意字符,如通过 a 连结到 a,边权即为 Pa,以及对于长度为 1 的字符串连结到长度为 2 的同理。

这样将图建完之后不难发现只需要 SPFA 跑一遍单源最长路,取最大的 dis 即可,如果存在正环那么显然无限大。

于是点数为 n=262+26+1,边数即为 m=26n,于是 SPFA 最坏复杂度即为 O(nm),也就是 265 的级别,可以通过。

当然这里我们用 map 实现,手动实现一个 hash() 之后用 unorderer_map 即可去掉 maplog

Code

[ABC264Ex] Perfect Binary Tree

题面

存在一棵以 1 为根节点的 n 个节点的树,给定序列 Pn1 表示 [2,n] 节点的父亲。给定 k,你需要从 [1,k] 中选择一些点,对于每一个 k 一次询问,求有多少种选法使得选出的点为一棵以 1 为根节点的满二叉树。输出 k[1,n] 的答案,答案对 998244353 取模。

Solution

首先一个比较重要的性质就是 n 个节点的满二叉树层高为 log2n,所以在原树里层高超过 log2n 的节点就可以直接忽略了。

不难想到 DP,令 dp(p,i) 表示以 p 为根节点层高为 i 的满二叉树方案数。

朴素的转移十分显然,即在其儿子里找到两个层高为 i1 的满二叉树拼起来即可,即转移为:

dp(p,i)=u<v,u,vsonpdp(u,i1)×dp(v,i1)

考虑到我们每次询问都是增加一个节点,如此的转移方式复杂度显然是不正确的,考虑优化。不难想到这个式子可以转化为从和平方里去除平方和,即:

dp(p,i)=12((usonpdp(u,i1))2usonpdp(u,i1)2)

于是这个东西就可以支持 O(1) 修改了,维护一下和以及平方和即可。注意需要记录上一次的值和新的值,减去旧的加上新的。同时考虑发现每次增加一个点,将会改变该点到 1 节点的整条链,并且只会改变这些点,同时若变化的节点超过 log2n 层了那么可以直接忽略。

最终的答案即为 i=1log2ndp(1,i)

所以每次修改都是 O(logn) 的,最终答案的查询也是 O(logn) 的,最终复杂度 O(nlogn)

Code

UPD

update-2023_01_03 初稿