做题记录 25.3.6

\(\textcolor{purple}\odot\) CF2069F Graph Inclusion

答案为 \(B\) 的联通块数量减去 \(A\cup B\)(两者边集之并)的联通块数量,线段树分治加可撤销并查集即可,时间复杂度 \(O(q\log q\log n)\)

代码

\(\textcolor{blue}\odot\) CF2069E A, B, AB and BA

因为 \(A\)\(B\) 的自由度比较大,因此考虑尽量放置 \(AB\)\(BA\),剩下的空由 \(A\)\(B\)

\(ca\)\(A\) 的总数,\(cb\)\(B\) 的总数,则必须要切出 \(C=\max(ca-a,cb-b)\)\(AB\)\(BA\) 才能满足 \(a\)\(b\) 的限制

\(s_i=s_{i-1}\),则两者一定不属于同一块,可将字符串从两者之间断开

这样得到若干形如 \((AB)^k\)\((BA)^k\)\((AB)^kA\)\((BA)^kB\) 的字符串

后两种分别最多贡献 \(k\)\(AB\)\(BA\)

前面两种要么分别贡献不超过 \(k\)\(AB\) 和不超过 \(k\)\(BA\),要么贡献不超过 \(k-1\)\(AB\)\(BA\)

显然 \(AB\)\(BA\) 的自由度 比 限定了 \(AB\) 还是 \(BA\) 更高,因此在后两者满足 \(ab\)\(ba\) 的限制的情况下尽量转化为前者

\(k\) 的总和相等,要使 \(k-1\) 之和尽量大就要令数量尽量少,即单个长度尽量大

因此要尽量把长的 \((AB)^k\)\((BA)^k\) 转化为 \(AB\)\(BA\)

因此将所有形如 \((AB)^k\)\((BA)^k\) 的字符串按长度从小到大排序,先尽量用 \(ab\)\(ba\) 填充(用两者填充的同时可以抵消 \(C\)),若不足则转化为 \(AB\)\(BA\)

设可转化的 \(AB\)\(BA\) 一共有 \(cnt\) 个,\(ab\)\(ba\) 分别代表使用后的剩余量,\(C\) 代表抵消剩余的量

则有解当且仅当 \(C\le \min(cnt,ab+ba)\)

时间复杂度 \(O(\sum n\log n)\),可基排优化到 \(O(\sum n)\)

代码

参考

\(\textcolor{blue}\odot\) CF2066D1 Club of Young Aircraft Builders (easy version)

相当于求满足以下要求的 \(a_{1\sim m}\) 的数量:

  • \(a_i\in \mathbb N,1\le a_i\le n\)
  • \(\sum_i [a_i=n]=c\)
  • \(\forall i,\sum_{j=1}^i[a_j\ge a_i]\le c\)

考虑 \(dp\),从大到小填数,令 \(dp_{i,j}\) 表示已经填了 \(j\) 个数,值在 \(i\sim n\) 的范围内,不考虑绝对顺序的方案数

由第二条限制得边界为 \(dp_{n,c}\),显然答案为 \(dp_{1,m}\)

转移时枚举当前数字填的数量

\[\binom{c}s dp_{i,j}\to dp_{i-1,j+s} \]

时间复杂度 \(O(nmc)\)

代码

\(\textcolor{blue}\odot\) CF2066C Bitwise Slides

\(s_i=\bigoplus_{j=1}^i a_j\)

显然进行完第 \(i\) 个操作后 \(P\oplus Q\oplus R=s_i\)

由于 \(P,Q,R\) 中有至少两个相同,因此第三个一定等于 \(s_i\)

\(p_{i,j}\) 表示进行前 \(i\) 次操作后 \((P,Q,R)=(s_i,j,j)\) 的方案数,\(q_{i,j}\) 表示 \((j,s_i,j)\)\(r_{i,j}\) 表示 \((j,j,s_i)\)

答案为 \(\sum_j (p_{n,j}+q_{n,j}+r_{n,j})\)

三个数组边界和转移完全相同,因此只考虑 \(p\)

边界值为 \(p_{0,0}=1\)

\((s_{i-1},j,j)\to (s_i,j,j)\) 时,转移为 \(p_{i-1,j}\to p_{i,j}\)

\((s_{i-1},j,j)\to (s_{i-1},j\oplus s_i,j)\)

  • 显然 \(s_{i-1}\ne s_i\),因此不会转移到 \(p\)
  • 若要转移到 \(q\),则 \((s_{i-1},j\oplus s_i,j)=(s_{i-1},s_i,s_{i-1})\),即 \(j=s_{i-1}\),转移为 \(p_{i-1,j}\to q_{i,s_{i-1}}\)
  • 若要转移到 \(r\),则 \((s_{i-1},j\oplus s_i,j)=(s_{i-1},s_{i-1},s_i)\),即 \(j=s_i\),转移为 \(p_{i-1,j}\to q_{i,s_{i-1}}\)

\((s_{i-1},j,j)\to (s_{i-1},j,j\oplus s_i)\) 时同理

综上得 \(p\) 的转移为

\[p_{i-1,j}\to p_{i,j}\\ 2p_{i-1,s_{i-1}}\to q_{i,s_{i-1}}\\ 2p_{i-1,s_i}\to q_{i,s_{i-1}}\\ \]

这样可以 \(O(nV)\) 得到答案

显然三个数组完全相同,因此令 \(f_{i,j}=p_{i,j}+q_{i,j}+r_{i,j}=3p_{i,j}\),边界变为 \(f_{0,0}=3\),答案为 \(\sum_j f_{n,j}\),转移为

\[f_{i-1,j}\to f_{i,j}\\ 2f_{i-1,s_{i-1}}\to f_{i,s_{i-1}}\\ 2f_{i-1,s_i}\to f_{i,s_{i-1}}\\ \]

第一条转移相当于将 \(f_{i-1,\ast}\) 拷贝到 \(f_{i,\ast}\),后两条相当于对 \(f_{i,s_{i-1}}\) 的单点修改

因此省略 \(f\) 的第一维,原地操作即可,时间复杂度 \(O(n+V)\)

发现实际上只关注 \(s_i\) 之间是否相同,因此将 \(s\) 离散化(\(0\) 也要包含)后可到 \(O(n)\),加上离散化的时间复杂度为 \(O(n\log n)\)

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

代码

\(\textcolor{blue}\odot\) CF2064E Mycraft Sand Sort

显然颜色序列不能变换,否则第一列无法满足

从左到右扫描,令 \(p'\)\(p\) 的逆排列,则第 \(i\) 时刻要删去位置 \(p'_i\) 的值并把两侧合并起来

用并查集将极大连续同色段缩为一个点,则此时实际删去位置选择的方案数为 \(p'_i\) 所在集合的总大小(删去的位置的大小为 \(0\),保留位置的大小为 \(1\)

用链表维护剩余所有剩余位置,每删去一个位置就通过链表找到上一个和下一个位置并尝试合并,答案即为累乘的结果

时间复杂度 \(O(\sum n\alpha(n))\)

代码

\(\textcolor{purple}\odot\) CF2063F2 Counting Is Not Fun (Hard Version)

\(n\) 个区间根据包含关系建成森林,添加 \(0\) 区间 \([0,2n+1]\) 作为所有根节点的父亲

\(f_i\) 表示区间 \(i\) 的父亲,\(ln_i\) 表示区间 \(i\) 的长度,令 \(H_n\) 表示卡特兰数第 \(n\) 项,令 \(vl_i=ln_i-2-\sum_{j\in son(i)}ln_j\),则答案为 \(\prod_i H_{vl_i}\)

时间倒流,转化为从树上删点,并查集维护父亲

预处理 \(H_i\)\(H_i^{-1}\) 可做到 \(O(\sum n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2064F We Be Summing

枚举 \(x,y\;(x+y=k)\),统计 \(\min(a_{l\sim i})=x\)\(\max(a_{i+1\sim r})=y\)\((l,r)\) 数量

用单调栈预处理出 \([ln_i,rn_i]\) 为包含 \(i\) 的极大区间满足区间第一个最小值为 \(a_i\)\([lx_i,rx_i]\) 为包含 \(i\) 的极大区间满足区间最后一个最大值为 \(a_i\)

假设 \(x\) 的位置分别在 \(px_{1\sim q}\)\(y\) 的位置分别在 \(py_{1\sim r}\),对于一组 \((u,v)=(px_i,py_j)\),若 \(u<v\)\([ln_u,rn_u]\)\([lx_v,rx_v]\) 不相离(\(rn_u\ge lx_v-1\)),则任意区间 \([l,r]\;(l\in[ln_u,u],r\in[v,rx_v])\) 都满足要求(取 \(i=rn_u\) 即可),且这样统计不会重复

这部分容易树状数组优化到 \(O(n\log n)\)

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

代码

参考

\(\textcolor{blue}\odot\) CF2063E Triangle Tree

对于点 \((u,v)\),当两者在同一直链时对答案无贡献,否则贡献为 \(2(\min(dep_u,dep_v)-dep_{\operatorname{lca}(u,v)})-1\)

考虑树上启发式合并

将轻子树合并到重子树时,开两个树状数组,分别保存重子树和轻子树对应深度的结点数量,枚举深度的 \(\min\) 计算贡献

时间复杂度 \(O(\sum n\log^2 n)\),常数较小

代码

posted @ 2025-03-07 07:12  Hstry  阅读(15)  评论(0)    收藏  举报