做题记录 25.5.8
\(\textcolor{purple}\odot\) CF1858E2 Rollbacks (Hard Version)
用一个数组保存数字,指针指向栈顶,加入数字相当于数组的单点修改和指针的移动,删除数组相当于指针移动,询问相当于查询前缀中数字种类数,撤销相当于单点修改和指针移动
转化为维护一个数组,支持单点修改和查询前缀数字数量,维护每个数字出现的位置集合,树状数组维护前缀和即可,时间复杂度 \(O(q\log q)\)
\(\textcolor{purple}\odot\) CF1856E2 PermuTree (hard version)
对于每个 \(u\) 最大化它作为 \(\text{lca}\) 的贡献,显然每个 \(u\) 之间独立,此时答案只和儿子的大小有关,设 \(u\) 的儿子大小分别为 \(s_{1\sim k}\)
问题转化为给定 \(s_{1\sim k}\),将 \(1\sim 1+\sum s_i\) 划分为 \(k+1\) 个组,前 \(k\) 组大小分别为 \(s_{1\sim k}\),最后一组大小为 \(1\),设最后一组中的数为 \(v\),则需要最大化 \((a,b)\) 的数量,满足 \(a,b\) 来自不同的组且 \(a<v<b\)
可证存在一种最优解满足每组都是一个连续段
将组按值排列,设第 \(k+1\) 组前面的组大小之和为 \(S\),则 \((a,b)\) 的数量为 \((\sum s_i-S)S\)
问题转化为给定 \(s_{1\sim k}\),从中选出一个子集,设子集和为 \(S\),最大化 \((\sum s_i-S)S\)
显然为 \(0/1\) 背包,使用 bitset 可做到 \(O(\frac n\omega \sum k)=O(\frac{n^2}\omega)\)
由于 \(\sum s_i=sz_u\),\(|\{s_i\}|=O(\sqrt {sz_u})\)
对于每种 \(s_i\),设有 \(cnt_{s_i}\) 个,可二进制拆分,压缩到 \(O(\sqrt {sz_u}\log {sz_u})\) 个数,实际上可以证明为 \(O(\sqrt {sz_u})\) 个
然后使用 bitset 优化即可,单个 \(u\) 可做到时间复杂度 \(O(\frac{sz_u\sqrt{sz_u}}\omega)\)
但是总复杂度可以卡到 \(\~O(n^2)\),无法接受
考虑将 \(s_i\) 中的最大值单独考虑,这样可证时间复杂度为 \(O(\frac{n\sqrt n}\omega)\) 的
需要手写 bitset 或使用特殊技巧
\(\textcolor{blue}\odot\) CF1854C Expected Destruction
相当于在 \([1,m]\) 有 \(n\) 个物体,每次等概率随机选择一个向右移动一步,若同一位置有多个则只保留一个,若移到 \(m+1\) 则移除,求所有物体都移除的期望时间
若允许重叠,则答案为 \(\sum_i m+1-s_i\)
考虑重叠对答案的影响,若在 \(x\) 处两个物体重叠,则答案减少 \(m+1-x\)
显然只需要考虑相邻的 \(s\) 的重叠
设 \(s_i\) 和 \(s_{i+1}\) 有 \(P(x)\) 的概率在 \(x\) 处重叠,则会令期望减少 \(P(x)(m+1-x)\)
枚举每一对 \(s_i\) 和 \(s_{i+1}\),令 \(dp_{x,y}\) 表示 \(s_i\) 向右移动 \(x\) 步,\(s_{i+1}\) 向右移动 \(y\) 步,且在此之前两者没有重叠过的概率
则 \(dp_{0,0}\gets 1\),转移为
令答案减少 \(\sum_{s_i+x=s_{i+1}+y}dp_{x,y}(m+1-s_i+x)\)
时间复杂度 \(O(n^3)\)
\(\textcolor{purple}\odot\) CF1849F XOR Partition
二分答案,\(a_i\oplus a_j\) 小于二分值时连边,判定是否为二分图
直接连边数量为 \(O(n^2)\),无法接受
将点按权值从小到大排序后,若 \(x\) 和 \(x+k(k\ge 4)\) 连边,则一定不合法
证明:考虑 \(a_x\oplus a_{x+k}\) 的最高二进制位,则在这一位上 \(a[x:x+k]\) 的一个非空真前缀为 \(0\),剩余非空真后缀为 \(1\),这一位以上相同
由于 \(k\ge 4\),因此 \(a[x:x+k]\) 中至少有三个数当前位取值相同,即值相异或的最高位一定在当前二进制位之下,即异或结果一定小于 \(a_x\oplus a_{x+k}\),三者两两连边,存在奇环,一定不合法
实际上由此过程可以发现,若只保留 \(x\) 和 \(x+k(k<4)\) 的边,这张图是否为二分图和整张图是否为二分图相同
因此 \(O(\log V)\) 二分,每次 \(O(n)\) 建图染色,总时间复杂度 \(O(n\log V)\)
\(\textcolor{purple}\odot\) CF1852D Miriany and Matchstick
令 \(f_{i,\text A/\text B,j}\) 表示 \(1\sim i\) 中 \(i\) 位置填了 \(\text A/\text B\),分数和能否为 \(j\),暴力 \(dp\) 为 \(O(n^2)\) 的
可证对于一个 \(f_{i,\text A/\text B,\ast}\),合法的 \(j\) 为一个区间或一个区间删除一个点的形式
因此可用三元组 \((l,r,p)\) 表示值为 \([l,r]/\{p\}\)
时间复杂度 \(O(n)\)
\(\textcolor{blue}\odot\) CF1849E Max to the Right of Min
令 \(pmn_i\) 为 \(i\) 之前第一个 \(<a_i\) 的位置,不存在则为 \(0\),令 \(pmx_i\) 为 \(i\) 之前第一个 \(>a_i\) 的位置,不存在则为 \(0\)
扫描右端点,设当前扫到 \(r\),则左端点在 \((pmn_r,r)\) 内的变为合法,在 \((pmx_r,r)\) 内的变为不合法,线段树维护即可
时间复杂度 \(O(n\log n)\)

浙公网安备 33010602011771号