做题记录 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}\)
转移时枚举当前数字填的数量
时间复杂度 \(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\) 的转移为
这样可以 \(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,\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)\),常数较小

浙公网安备 33010602011771号