杂题瞎做
\(\color{green}\bigstar\) 表示独立做出,\(\color{red}\blacksquare\) 表示查看题解/群里问了大佬做出。
ARC058D
\(\color{green}\bigstar\)
题意
有一个 \(H\) 行 \(W\) 列的网格,由 \((x,y)\) 只能走到 \((x+1,y)\) 和 \((x,y+1)\),所有 \((H-A+1\le x\le H,1\le y\le B)\) 的格子不能进入,问从 \((1,1)\) 到 \((H,W)\) 有多少种方案。答案对 \(10^9+7\) 取模。
\(1\le A<H\le 10^5\),\(1\le B<W\le 10^5\)
思路
考虑把路径拆成两部分:\((1,1)\to(H-A,i)\to(H,W)\),其中 \(B+1\le i\le W\)。
对于第一部分,由于 \(x\) 的增量为 \(H-A-1\),\(y\) 的增量为 \(i-1\),方案数即为 \(\displaystyle{(H-A-1)+(i-1)\choose H-A-1}\)。
对于第二部分,我们强制第一步由 \((H-A,i)\) 走到 \((H-A+1,i)\),套用上面的方法,得到方案数为 \(\displaystyle{(A-1)+(W-i)\choose A-1}\),那么 \(i\) 的贡献即为 \(\displaystyle{(H-A-1)+(i-1)\choose H-A-1}{(A-1)+(W-i)\choose A-1}\),直接计算即可,时间复杂度 \(O(H+W)\)。
CF1796C
\(\color{red}\blacksquare\)
题意
对于一个集合,如果对于其中的任意两个数 \(x\le y\),都有 \(x\mid y\),则我们把此集合称作“好集合”。
给你一个区间 \([l,r]\),问集合元素均在此区间内的“好集合”最大大小与达到最大大小的“好集合”数量。后一问对 \(998244353\) 取模。
多组询问,\(1\le T\le 2\times 10^4,1\le l\le r\le 10^6\)。
思路
首先显然“好集合”的定义等价于从小到大排列后相邻两个数为倍数关系。
那么为了让“好集合”大小尽可能大,我们肯定是从 \(l\) 开始,不断地乘 \(2\),直到超过 \(r\),设 \(k\) 为最大的满足 \(l\times 2^k\le r\) 的数,有 \(k=\log_2(\dfrac{r}{l})\),则第一问答案即为 \(k+1\)(算上 \(l\) 本身)
考虑第二问,可以发现,对于大小相邻两个数的倍率最多为 \(3\),因为如果倍率为 \(4\) 的话,我们一定可以把其拆成两次乘 \(2\) 操作,显然更优。
故考虑枚举总倍率 \(v=2^{k-i}\times 3^i\),则初始数的最大值为 \(\lfloor\dfrac{r}{v}\rfloor\),可选值数量即为 \(\lfloor\dfrac{r}{v}\rfloor-l+1\),而因为我们可以随意分配 \(\times 3\) 的位置,所以又有额外的 \(\displaystyle{k\choose i}\) 种方案,暴力枚举 \(i\) 即可,时间复杂度 \(O(T\log r)\)。
CF1799C
\(\color{green}\bigstar\)
题意
给你一个字符串 \(s\),求重排 \(s\) 的字符后 原串与反串的字典序最大的那个 字典序最小的字符串。
思路
由于可以任意重排 \(s\),故我们可以先排序,然后遍历,依此处理。
若当前遍历到了 \(s_i\),分类讨论:
-
若 \(i=n\):
直接将其加入答案串中即可。
-
若 \(s_i=s_{i+1}\):
显然将这两个字符加入答案串左右两端最优(因为后面的字符都不小于它)
-
若 \(s_i\ne s_{i+1}\):
-
若之后的字符串中仅出现了 \(s_{i+1}\):
那么可以把 \(s_{i}\) 放在之后的字符串的中间后插入答案串,例如
aaabaaa这样肯定是最优的(因为移动 \(b\) 会导致 原串与反串的最大字典序 变大,必定变劣) -
若之后的字符串还出现了其他字符:
那么由于后面的字符单调不降,我们将 \(s_{i+1}\) 放在前面,\(s_i\) 放在后面,那么字典序更大的肯定是原串(因为前面的字符都相等),故我们把剩下的字符按不降序插入中间即可。
-
CF1789C
\(\color{green}\bigstar\)
题意
给一个长度为 \(n\) 的序列 \(A_0\),有 \(m\) 次操作,第 \(i\) 次操作会把 \(A_{i-1}\) 的第 \(p_i\) 个元素修改为 \(v_i\),将结果存在 \(A_i\) 里面。问对于所有 \(i<j\),\(A_i\) 与 \(A_j\) 数的种数的和是多少。保证 \(A_i\) 里面的数两两不同。
多组询问,\(1\le T\le 10^4,1\le n,m\le 2\times 10^5,1\le A_{i,j},v_i\le n+m,1\le p_i\le n\)。
思路
直接统计不重数量较为困难,考虑统计重复数的数量,容斥一下即是答案。
考虑对每个数计算它的出现次数,对一个数 \(i\),由于 \(A_i\) 里面的数两两不重,考虑维护数 \(i\) 现在是在哪一步出现的,记作 \(l_i\),初始时 \(l_{A_{0,i}}=0\)。那么对于一次修改操作,数 \(A_{i-1,p_i}\) 消失,对 \(A_{i-1,p_i}\) 的出现次数产生 \(i-l_{A_{i-1,p_i}}\) 的贡献,接着,由于 \(v_i\) 出现,我们将 \(l_{v_i}\) 设为 \(i\) 即可。
注意最后要处理一下尚未消失的数的贡献,为 \(m+1-l_i\)。那么答案即为 \(\displaystyle mn(m+1)-\sum_{i=1}^{n+m}\dfrac{c_i(c_i-1)}{2}\),其中 \(c_i\) 为数 \(i\) 的出现次数。
CF1800F
\(\color{red}\blacksquare\)
题意
有 \(n\) 个仅含小写字母的字符串 \(s_i\),对于一对下标 \(1\le i\le j\le n\),设 \(t\) 表示 \(s_i\) 和 \(s_j\) 顺次拼接的结果,它合法当且仅当:
- \(|t|\equiv 1\pmod 2\)
- \(t\) 中正好有 \(25\) 个不同的字母
- 每个在 \(t\) 中出现的字母必定出现奇数次
问合法的下标对数。
\(1\le n\le 2\times 10^5,\displaystyle\sum|s_i|\le 5\times 10^6\)
思路
首先第一个约束是没用的,因为只要满足后面两个条件,第一个条件就必然满足。
由于一共只有 \(26\) 个不同的字母,考虑枚举哪个字母没有出现,而出现奇数次可以想到异或,那么对于一个字符串 \(s_i\),维护字母出现情况与字母出现次数的奇偶性即可,可以使用 bitset+map,时间复杂度 \(O(cn\dfrac{c}{w}\log n)\)。
ABC292G
\(\color{red}\blacksquare\)
题意
给你 \(n\) 个长为 \(m\) 且仅由数字和 ? 组成的字符串,问有多少种将所有 ? 替换成数字的方案,使得在字典序上满足 \(S_i<S_{i+1}\)。
思路
好题。
设 \(f_{l,r,c}\) 表示对于区间 \([l,r]\) 内的 \(S_i\),钦定前 \(c\) 位相等且满足条件的方案数。
那么考虑第 \(c+1\) 位。设 \(g_{i,v}\) 表示对于区间 \([l,i]\),\(S_i\) 的第 \(c+1\) 位填的数不超过 \(v\) 的方案数。
那么可以枚举最后一个相同段 \([j,i]\) 满足 \(S_j\) 的第 \(c+1\) 位要么是 ? 要么是同一个数,直接由 \(g_{j-1,v-1}\) 转移至 \(g_{i,v}\) 即可。
注意特判当前段全为 ? 的情况,此时可以填任意数。
答案即为 \(f_{1,n,0}\),可以使用记忆化搜索。
ARC133D
\(\color{red}\blacksquare\)
题意
求
对 \(998244353\) 的值。
\(1\le L\le R\le 10^{18},1\le v\le 10^{18}\)
思路
牛逼逼题。
我们先考虑没有 \(l\le r\) 的限制的情况,先做个前缀和,即 \(s_i=\displaystyle\oplus_{i=0}^ni\),那么要统计的东西就变成了:
但我们会发现这玩意没有对称性,很蛋疼,于是考虑强行把区间拉平得到
考虑这玩意多算了哪些东西,可以发现,我们多算的部分是 \(l=r\) 的部分(对应到一开始的式子不是合法情况),去掉这一部分后,我们会发现我们会同时统计 \((l,r)\) 与 \((r,l)\),因此再除以 \(2\) 就得到了我们要的东西。
考虑做个前缀和,设
那么我们要求的东西就变成了 \(S(R,R)-2S(L-2,R)+S(L-2,L-2)\),考虑如何求 \(S(n,m)\) 即可。
考虑 \(s_i\) 的计算,可以发现如下事实:
s[------00] = 0^------00 = ------00
s[------01] = ------00^------01 = 1
s[------10] = 1^------10 = ------11
s[------11] = ------11^------11 = 0
因此,我们有:
可以发现,对于 \(l\equiv 1,3\pmod 4\) 或 \(r\equiv 1,3\pmod 4\) 的情况,由于 \(s_{l/r}\) 为常量,故可以直接计算。
可以发现当确定末两位后可以直接删掉后两位,那么就没有模 \(4\) 的限制了。
对于剩下的内容,等价于求
而这是一个 trivial 的数位 dp,硬冲就完了。
时间复杂度 \(O(\log n)\)
ABC276G
\(\color{red}\blacksquare\)
题意
青蛙。
思路
考虑差分,设 \(d_i=a_i-a_{i-1}\),特别的,\(d_1=a_1\),那么约束就变成了
- \(\displaystyle\sum d_i\le m\)。
- 对所有 \(i>1\) 有 \(d_i\not\equiv 0\pmod 3\)。
发现 \(d_1\) 非常特殊,于是可以单独考虑 \(d_1\equiv 0\pmod 3\)。以下设 \(d_1\not\equiv 0\pmod 3\),\(d_1\equiv 0\pmod 3\) 同理。
那么 \(d_i\) 只能是 \(3k+1\) 或 \(3k+2\) 的形式。考虑枚举形如 \(3k+2\) 的 \(d_i\) 的数量,设其为 \(c\),那么 \(3k+1\) 形式的数的数量即为 \(n-c\),方案数为 \(\displaystyle{n\choose c}\)。于是剩下的步骤相当于将不超过 \(\lfloor\dfrac{m-2c-(n-c)}{3}\rfloor\) 组物品放置在 \(n\) 个箱子内,这玩意可以插板+前缀和预处理。
ABC295Ex
\(\color{red}\blacksquare\)
状压 dp,2 hd 4 me/ng。
题意
开始你有一个全 \(0\) 矩阵,你可以随意执行如下操作:
- 选择任意一行,将其从最左端开始的连续一段染成 \(1\)。
- 选择任意一列,将其从最上端开始的连续一段染成 \(1\)。
如果一个矩阵可以由此得到,那么这个矩阵被称为好的。
现在你有一个 01? 矩阵 \(a\),你需要将所有 ? 替换为 0 或 1,问得到的矩阵中有多少个是好的。答案对 \(998244353\) 取模。
\(1\le n,m\le 18\)。
思路
可以发现一个矩阵是否合法取决于对每个格子而言,其上方或左方是否有一方仍是全 \(1\) 段。
于是考虑设 \(f_{(i,j),k=0/1,s}\) 表示现在处理完了 \((i,j)\),列状态为 \(s\)(列状态指目前 \(m\) 列里每一列是否仍为全 \(1\) 段),行状态为 \(k\)(即当前行是否仍为全 \(1\) 段)。
初始状态为 \(f_{(1,0),1,\text{full}}=1\),即啥都没填的情况。
对当前状态 \(f_{(i,j),k,s}\),我们分类讨论:
格子不在行末
那么下一个格子即为 \((i,j+1)\),我们继续分类讨论:
- \(a_{i,j+1}=0\):那么第 \(j+1\) 列的列状态则变成 \(0\),第 \(i\) 行的行状态变为 \(0\),即 \(f_{(i,j),k,s}\to f_{(i,j+1),0,s_{j+1}\gets 0}\)。
- \(a_{i,j+1}=1\):要求当前行状态与第 \(j+1\) 列的列状态不能全为 \(0\),转移方程为 \(f_{(i,j),k,s}\to f_{(i,j+1),k,s}\)。
- \(a_{i,j+1}=\text{?}\):综合上面两种情况即可。
格子在行末
可以发现这种情况相当于将 \((i,j)\) 移到了下一行的 \((i+1,0)\),重置行状态,然后按 \(j<m\) 做即可。
最终答案即为 \(\displaystyle\sum_{i}\sum_{j}f_{(n,m),i,j}\)。
CF123E
\(\color{red}\blacksquare\)
题意
简述题意:给你一棵树,每个点有一个被选为起点的概率和一个被选为终点的概率,从起点开始随机遍历子树,问到达终点的期望步数。
思路
直接计算答案很难,考虑对一对 \((S,T)\) 来说,以 \(S\) 为根,那么有:
- 对 \(T\) 的子树里的点:显然不会被遍历到,贡献为 \(0\)。
- 对 \(S\to T\) 路径上的点:显然会被刚好遍历 \(1\) 次,贡献为 \(1\)。
- 对不在上述两种情况中的点:设其为 \(x\),当我们遍历到 \(x\) 和 \(T\) 的分界点时,我们有 \(\dfrac{1}{2}\) 的概率往 \(x\) 的方向走,此时贡献为 \(2\)(往返);同时也有 \(\dfrac{1}{2}\) 的概率往 \(T\) 的方向走,此时贡献为 \(0\)。故总贡献为 \(\dfrac{1}{2}\times 2+\dfrac{1}{2}\times 0=1\)。
那么问题就变成了求对每一对 \((S,T)\),以 \(S\) 为根,\(n-s'_T\) 的期望(\(s'_T\) 表示 \(T\) 在以 \(S\) 为根的情况下的子树大小)。
首先任选一个根,考虑枚举 \(T\),那么有以下几种情况:
- \(S=T\):那么 \(s'_T\) 显然为 \(n\)。
- \(S\) 在 \(T\) 的子树里:那么 \(s'_T\) 即为所有点去掉 \(S\) 所在的那棵子树,设 \(S\) 所在的那棵子树的根为 \(p\),那么 \(s'_T=n-s_p\)。
- \(S\) 不在 \(T\) 的子树里:那么 \(s'_T\) 即为 \(s_T\)。
我们可以 \(O(n)\) 遍历整棵树来计算 \(s_T\) 以及 \(S\) 在 \(T\) 的子树中的概率,直接计算即可。

浙公网安备 33010602011771号