ABC264题解

\(ABC264\) 题解

\(B\)

\(Problem\)

有如下 \(15\times 15\) 的矩阵图:

每次询问给定 \(r\)\(c\),问该矩阵第 \(r\) 行第 \(c\) 列是什么颜色。

\(Scope\ Limitation\)

\(1\leq r,c\leq 15\)

\(Solution\)

这场的 \(D\) 题很简单,但是做 \(B\)\(C\) 却着实废了一番手脚,想了想决定写一下这个 \(B\) 的解法,大家通过的方式应该算得上千奇百怪,但这题的 \(r\)\(c\) 有可能可以出到比较大的地步。

看似十分简单的一道题目,做起来却有些手足无措,大抵原因是并不知道如何最简单的实现。

开始很想手打,但是觉得作为第二题一定会有很简单的规律,虽然事实也正是如此,可我并没能发现,也许直接手打真的会快很多吧。

后来直接写了个八连通扩张,每次扩张一个回字,暴力跑出这个图,显得很蠢。

事实上,真正的规律是这样的,观察 \(max\{|r - 8|,|c-8| \}\) 的奇偶性,就能得出答案。

\(E\)

\(Problem\)

\(n\) 座城市和 \(m\) 个发电站,他们通过 \(e\) 条边相连。

如果城市 \(i\) 和任意一个发电站在同一个连通块中,我们认为城市 \(i\) 通电。

给定 \(q\) 次询问,每次询问删掉一条边,影响会持续到下一次询问,问每次删除后,图上有多少座城市通电。

\(Scope\ Limitation\)

\(1\leq n, m< n + m\leq 2\times 10 ^5,1\leq Q\leq E\leq 5\times 10 ^ 5\)

\(Solution\)

十分套路的题目,存下询问,倒着加边,并查集维护即可。

\(F\)

\(Problem\)

有一个由 \(01\) 组成的 \(n\)\(m\) 列矩阵,可以花费 \(r_i\) 的代价将第 \(i\) 行的 \(01\) 全部翻转,可以花费 \(c_i\) 的代价将第 \(j\) 列的 \(01\) 全部翻转。

\((1,1)\) 出发,只能向右或下移动,且当前位置与移动目标的颜色必须相同,问最少花费多少代价,才能到达 \((n,m)\)

\(Scope\ Limitation\)

\(2\leq n, m \leq 2000\)

\(Solution\)

挺容易想到 \(dp\) 的。

设状态 \(dp[i][j][0/1][0/1]\) 表示从 \((1,1)\) 走到 \((i,j)\) 且第 \(i\) 行与第 \(j\) 列是否翻转的最小代价。

一开始没看到只能向右下移动,想了很久,觉得这个状态转移不了,后来手模了一遍样例,才醒悟过来存在这样的限制,那我们的转移就十分简单了。

初始值分别为:

\(dp[1][1][0][0] = 0,dp[1][1][1][0] = r_1,dp[1][1][0][1] =c_1,dp[1][1][1][1] = r_1 + c_1\)

转移如下:

  • \(i < n\):设根据 \(x\)\(y\) 算出 \((i,j)\) 的颜色为 \(a\)\((i+1,j)\) 的颜色为 \(b\)
    • \(a = b\)\(dp[i][j][x][y]\rightarrow dp[i + 1][j][0][y]\)
    • \(a\neq b\)\(dp[i][j][x][y] + r_{i + 1}\rightarrow dp[i+1][j][1][y]\)
  • \(j < m\):设根据 \(x\)\(y\) 算出 \((i,j)\) 的颜色为 \(a\)\((i,j+1)\) 的颜色为 \(b\)
    • \(a = b\)\(dp[i][j][x][y]\rightarrow dp[i][j+1][x][0]\)
    • \(a\neq b\)\(dp[i][j][x][y] + c_{j + 1}\rightarrow dp[i][j+1][x][1]\)

状态数 \(\mathcal O(n^2)\)

\(G\)

\(Problem\)

给定 \(n\) 个条件,每组条件如下:

\(T_i\) 是一个由小写字母组成的长度不超过 \(3\) 的字符串,\(P_i\) 是一个整数。

定义一个字符串 \(S\) 的权值如下:

\(V_i\) 表示 \(T_i\)\(S\) 中出现的次数乘上 \(P_i\),则 \(S\) 的权值即为 \(\sum_{i=1}^n V_i\)

求对于给定的 \(n\) 个条件,任意由小写字组成的字符串 \(S\) 的最大权值,若为正无穷,输出 \(Infinity\)

\(Scope\ Limitation\)

\(1\leq N\leq 18278\)

\(Solution\)

\(P(T)\) 权值如下:

  • \(T = T_i\)\(P(T) = P_i\)
  • \(T\) 不存在任何 \(T_i\) 与之相等,则 \(P(T) = 0\)

设当前 \(S = s_1s_2s_3……s_l\),若在末尾加入一个字符 \(s'\),则对权值的影响为 \(P(s')+P(s_ls')+P(s_{l-1}s_ls')\)

当然,若 \(S\) 的长度小于 \(2\),则权值变化另算,我们也可以在一开始就往 \(S\) 中加入两个小写字母以外的字母,根据上述定义,亦能得到正确的值。

于是我们考虑设置这样一张图,图上的每个节点代表一个由两个字母组成的状态,枚举第三个字母,向另一个状态转移连边,例如状态 \(ab\) 向状态 \(bc\) 连接一条边权为 \(P(c) + P(bc)+P(abc)\) 的边。

\(w = 26\),则我们的点数是 \(\mathcal O(w ^ 2)\),边数是 \(\mathcal O(w^3)\),由于需要找正环,跑一边 \(SPFA\) 最长路,最劣 \(\mathcal O(w^5)\),足以通过此题。

\(Ex\)

\(Problem\)

给定一棵大小为 \(n\) 的树,根节点为 \(1\),节点 \(i(i>2)\) 的父亲为 \(P_i\)

要求对 \(k = 1,2……n\) 分别求出对于节点 \(1\)\(k\),有多少棵以 \(1\) 为根的完美二叉树。

\(Scope\ Limitation\)

\(1\leq n\leq 3\times 10 ^5,1\leq P_i<i\)

\(Solution\)

发现这样一个事实,一定不存在深度大于等于 \(20\) 的答案,一棵深度等于 \(20\) 的完美二叉树节点的数量为 \(2 ^ {20} - 1 > 3\times 10 ^ 5\),故由此结论。

考虑 \(dp\),设 \(f[i][j]\) 表示以节点 \(i\) 为根,深度为 \(j\) 的完美二叉树的数量,\(g[i][j]\) 表示 \(\sum_k^n [p_k = i]f[k][j]\)

那么直接转移即可,每次加入一个点,顺着父亲向根更新。

设当前节点为 \(v\),父节点为 \(u\),以节点 \(v\) 为根深度为 \(cir\) 的二叉树有 \(res\) 棵。

\(val = res \times(g[u][cir] - f[v][cir])\),简单来说就是减去老的,用新的和另外的子树匹配。

\(res\) 更新 \(g[u][cir]\)\(f[v][cir]\),然后 \(res = val\),节点继续向上跳,直到为根。

时间复杂度 \(\mathcal O(20n)\)

posted @ 2022-08-14 17:35  ╰⋛⋋⊱๑落叶๑⊰⋌⋚╯  阅读(89)  评论(0编辑  收藏  举报