数据结构选做 #3
数据结构选做 #3
Problem A. UOJ671 诡异操作
脑洞过大。
若只有操作 \(1\),那么记节点势能为 \(\log \max(v)\)。操作 \(l,r\) 时,先定位区间 \((l,r)\),\(O(\log n)\);然后继续暴力递归,若这个区间都为 \(0\) 就返回,每个遍历到的节点势能减少 \(1\)。复杂度 \(O(q\log n+n\log V)\)。
加上操作 \(2\),那么需要在节点上维护 \(2^k\) 这一位出现了多少次,记为 \(v_{p,i}\),操作 \(2\) 打 tag 即可,单词修改 \(O(\log n\log V)\);但操作 1 复杂度变为 \(O(n\log ^2 V+q\log n\log V)\)。
瓶颈在于 Pushup 与 Pushdown。\(v_{p,i}\) 本质上是 \(\log len\times \log V\) 的 01 矩阵,需要一列一列合并,但其实可以一行一行合并。这样复杂度降为 \(O(\log len)\)。
2 操作复杂度降为 \(O(\log^2 n)\)。考虑 1 操作,定位区间复杂度 \(O(\log ^2n)\),向下递归总复杂度 \(O(\log V\times \sum \log(len_i))\),而 \(\sum \log(len_i)=T(n)=2T(n/2)+O(\log n)=O(n)\),所以复杂度 \(O(Q\log^2 n+n\log V)\)。
https://uoj.ac/submission/811979
Problem B. P7739 [NOI2021] 密码箱
不难看出答案为连分数 \([a_0,a_1,a_2,\cdots a_n]\)。
连分数的渐进分数有递推公式,
且任意 \(p_k,q_k\) 都互质。
经过推导,实际上 W 操作是将 \(p_n\) 变为 \(p_{n-1}+p_n\),E 操作是将 \(p_n\) 变为 \(2p_n-p_{n-1}\),\(p_{n-1}\) 变为 \(p_n\),\(q\) 同理。这个变换可以用矩阵乘法刻画,平衡树维护矩阵乘积即可。
Problem C. CF710F String Set Queries
设 \(K=\sum |s_i|\)。
首先发现答案可以拆为总的减去删掉的。
根号重构,总长度每 \(B\) 个分一块,散块内查询时暴力匹配,每个整块建一个 ACAM,总复杂度 \(O(K|\Sigma|+K\sqrt{K})\)。
建 ACAM 和询问的复杂度还是不够平衡。每加入一个串就新建一个 ACAM,若和前面的一个串个数相同就合并。只会有 \(O(\log K)\) 个 ACAM,每个串只会被合并 \(O(\log K)\) 次,所以总复杂度 \(O(K|\Sigma|\log K)\)。

浙公网安备 33010602011771号