杂题瞎做

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

code

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

code

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\) 放在后面,那么字典序更大的肯定是原串(因为前面的字符都相等),故我们把剩下的字符按不降序插入中间即可。

code

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\) 的出现次数。

code

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

code

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}\),可以使用记忆化搜索。

code

ARC133D

\(\color{red}\blacksquare\)

题意

\[\sum_{l=L}^R\sum_{r=l}^R[(\oplus_{i=l}^ri)=v] \]

\(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\),那么要统计的东西就变成了:

\[\sum_{l=L-1}^{R-1}\sum_{r=L}^R[s_l\oplus s_r=v] \]

但我们会发现这玩意没有对称性,很蛋疼,于是考虑强行把区间拉平得到

\[\sum_{l=L-1}^{R}\sum_{r=L-1}^R[s_l\oplus s_r=v] \]

考虑这玩意多算了哪些东西,可以发现,我们多算的部分是 \(l=r\) 的部分(对应到一开始的式子不是合法情况),去掉这一部分后,我们会发现我们会同时统计 \((l,r)\)\((r,l)\),因此再除以 \(2\) 就得到了我们要的东西。

考虑做个前缀和,设

\[S(n,m)=\sum_{l=0}^n\sum_{r=0}^m[s_l\oplus s_r=v] \]

那么我们要求的东西就变成了 \(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

因此,我们有:

\[s_i=\begin{cases} i & i\equiv0\pmod 4\\ 1 & i\equiv1\pmod 4\\ i+1 & i\equiv2\pmod 4\\ 0 & i\equiv3\pmod 4 \end{cases} \]

可以发现,对于 \(l\equiv 1,3\pmod 4\)\(r\equiv 1,3\pmod 4\) 的情况,由于 \(s_{l/r}\) 为常量,故可以直接计算。

可以发现当确定末两位后可以直接删掉后两位,那么就没有模 \(4\) 的限制了。

对于剩下的内容,等价于求

\[\sum_{l=0}^{\lfloor n/4\rfloor}\sum_{r=0}^{\lfloor m/4\rfloor}[l\oplus r=\lfloor v/4\rfloor] \]

而这是一个 trivial 的数位 dp,硬冲就完了。

时间复杂度 \(O(\log n)\)

code

ABC276G

\(\color{red}\blacksquare\)

题意

青蛙。

思路

考虑差分,设 \(d_i=a_i-a_{i-1}\),特别的,\(d_1=a_1\),那么约束就变成了

  1. \(\displaystyle\sum d_i\le m\)
  2. 对所有 \(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\) 个箱子内,这玩意可以插板+前缀和预处理。

code

ABC295Ex

\(\color{red}\blacksquare\)

状压 dp,2 hd 4 me/ng。

题意

开始你有一个全 \(0\) 矩阵,你可以随意执行如下操作:

  • 选择任意一行,将其从最左端开始的连续一段染成 \(1\)
  • 选择任意一列,将其从最上端开始的连续一段染成 \(1\)

如果一个矩阵可以由此得到,那么这个矩阵被称为好的。

现在你有一个 01? 矩阵 \(a\),你需要将所有 ? 替换为 01,问得到的矩阵中有多少个是好的。答案对 \(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}\)

code

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\) 的子树中的概率,直接计算即可。

code

posted @ 2023-02-24 20:00  bykem  阅读(37)  评论(0)    收藏  举报