希望不要是终章
Solution Set #12
2025.11.14
837. CF1774G(容斥,倍增,抵消贡献)
显然要将奇偶放在一起分析。考虑容斥点集 \(S\) 必须不被覆盖,若一个区间没有覆盖 \(S\) 中的点,那么可选可不选,进而会对 \(f(l,r),g(l,r)\) 造成相同的贡献,这样贡献为 \(0\);因此要求所有区间都不可选,这样才不会被消除掉贡献。令 \(f(S)\in\{0,1\}\) 表示是否有所有区间覆盖至少覆盖一个 \(S\) 中的元素,答案为 \(\sum (-1)^{|S|}f(S)\)。
考虑对 \(f(S)=1\) 的 \(S\) 进行 dp,令 \(f_i\) 表示最后一个元素为 \(i\) 的贡献,那么可行转移的 \(j\) 是一段后缀,处理出最大的 \(t\) 使得 \([t,i-1]\) 包含给定区间中至少一个,此时 \(j\in[t,i-1]\)。处理 \(f\) 的前缀和为 \(sum\),有 \(f_i=sum_{t-1}-sum_{i-1},sum_i=sum_{i-1}+f_i=sum_{t-1}\)。最终关心的是 \(sum_r,sum_{r+1}\),答案为 \(f_{r+1}=sum_{r+1}-sum_r\),由这个转移可以发现在跳出 \(l\) 之前可以快速把 \(n\) 一直往前跳,处理一下不关心 \(l\) 时的 \(t\) 就连成一棵树,最终跳到的位置往前都有 \(t=l-1\),这一段区间的 \(sum\) 可以快速计算。倍增优化一下跳跃就是 \(\mathcal O(n\log n)\) 的复杂度。
另一个思路是抵消贡献,显然 \(I_1\subseteq I_2\) 时选 \(I_2\) 就没贡献,这样只剩下严格相交和相离。\(l,r\) 双单调,若 \(I_i\subseteq (I_{i-1}\cup I_{i+1})\) 会发现同时选 \(i-1,i+1\) 无贡献,进而线段会形成两排互不相交的线段。
838. 20251114 联考 D(dag,子集反演,容斥)
首先确定一棵以 \(1\) 为根的外向生成树 \(T\),然后去除所有前向非树边,这样只剩下横叉边。令 \(m\) 表示 \(m'-n+1\),即非树边数量。令所有 \(u\to v\) 的非树边的 \(v\) 作为关键点。令关键点集合为 \(U\),显然 \(f(A)\) 可以表示成若干互相无祖先关系的点在 \(T\) 上的子树集合之并,称其为代表子集 \(g(f(A))\),我们声称 \(g(S)\) 一定形如 \(U\) 的某个子集外加至多一个非关键点 \(R\)。
考虑第二种形态,枚举 \(R\) 之后,\(R\) 的子树内一定不能再选点,并且必然有 \(R\in A,R\in f(A)\),因此能选的点就是所有可以到达 \(R\) 的点。此时查询至多 \(m-n+1\) 个点在树上的链并即可,即考虑 \(u\to v\) 的边倒过来,走到它的非树边的 \(u\) 以及它本身的链并,按照 dfn 排序后除掉相邻 lca 的信息。本题值域限制中没有除 \(0\)。
第一种形态可以考虑容斥,钦定 \(S\subseteq f(A)\),计算此时的 \(\sum\prod p_i\),最终做子集反演。预处理每个点可以到达的关键点集合,先做高维前缀和下传,然后考虑 \(f(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}g(T)\),可以对 \(\sum (-1)^{|T|}g(T)\) 做高维前缀和,最终再在每个位置乘上 \((-1)^{|S|}\) 的贡献。注意这种情况要容斥掉第二种形态的贡献。
时间复杂度 \(\mathcal O(2^{m-n}(m-n)+n(m-n)\log n)\)。
839. 20251114 联考 A(结论推导,拓展域并查集)
观察到可以先执行完所有取反操作后再做删除操作,否则某个取反操作一定覆盖了一个之前的删除操作,把这个段拉长成两段,不会影响删除的段是全部相同的。再考虑删除操作,可以认为第一个位置的值是 \(0\),这样直接转化为删掉连续的 \(k\) 个 \(0\)。从实际意义上除了取反这一段,别的什么都不影响,所以是正确的。
考虑异或差分,令 \(p_i=a_i\oplus a_{i+1}\),每次操作形如选取 \(1\leq i\leq n-k+1,p_i\to p_i\oplus 1,p_{i+k}\to p_{i+k}\oplus 1\),注意 \(p_{n+1}\) 的值是不重要的。观察每个 \(\bmod k\) 的等价类,如果是 \((n+1)\bmod k\) 对应的等价类,最终的 \(p'\) 可以是任意的;否则充要条件是 \(p'\) 与 \(p\) 中 \(1\) 个数的奇偶性相同,令每个等价类 \(1\) 个数奇偶性为 \(v_i\)。删除操作相当于对于每个等价类的 \(0\) 的个数各自全部 \(-1\)。
先考虑没有 ? 的情况,猜测此时可以生成出来很多 \(b\)。处理出每个等价类中 \(1\) 个数的奇偶性。考虑删除的上界 \(lim\)。对于最终删除 \(t\) 次的情况,答案是 \(2^{n-tk-k+1}\),注意在最大值需要特殊处理每个等价类是否有充足的 \(0\)。观察 ? 的影响,相当于同时取反 \(v_i,v_{(i+1)\bmod k}\),注意特判 \(a_n\) 为 ?,此时是否取反会完全不同。对于剩余的位置,我们只关心,对于每个 \(i\) 是否存在可以使得 \(p_i,p_{(i+1)\bmod k}\) 同时取反的位置。发现在 \(t\in[0,lim-1]\),无论如何都能取到 \(2^{n-tk-k+1}\),在 \(t=lim\),一些位置需要限制必须有 \(v=0\)。记第 \(i\) 个是否取反为 \(x_i\),相当于限定其中一些 \(x_i,x_{i+1}\) 的相等或不等关系,拓展域并查集判一下,求出连通块个数即可。时间复杂度 \(\mathcal O(n)\)。
840. *20251114 联考 C(结论推导,dfs 序)
部分分:显然的 dp 是 \(f_{u,l}\) 表示 \(u\) 传入 \([l,l+size_u-1]\) 时的最小代价,结论是 \(f_u\) 是关于 \(l\) 的二次函数。
由于子树大小固定,所以传入 \([l,r]\) 时只需要决策将 \(l\) 放入哪个子树。给出结论,不管 \(l,r\) 具体是多少,对于同一个 \(v\) 而言 \(f(v,l,r)\) 取到最优值的策略都是相同的。证明这个结论考虑假若 \(f(v,l_1,r_1)\) 的最优策略在 \(f(v,l_2,r_2)\) 上不能取到最优值,那么把 \(f(v,l_2,r_2)\) 的策略搬到 \(f(v,l_1,r_1)\) 上就会取到比原本更优的值,导出矛盾。
此时假设最优策略是把结点 \(i\) 的 \(a_i\) 调整成 \(l+p_i\),由于查询的是相减所以要一起算,发现最终值与 \(p_i\) 无关。推导后拆一下可以树状数组维护信息,时间复杂度 \(\mathcal O(n\log n)\)。
841. 20251114 梦熊
C. P11904(图论,dp)
考虑 dp:当前在 \(u\),至少需要纠正多少次才能保证到 \(n\),如果 \(u\) 不可达 \(n\) 则为 \(+\infty\)。有 \(f_u=\min(\min(f_v)+1,\max(f_v))\)。观察转移,发现当且仅当 \(\max f_v=\min f_v\) 时选择后者是优秀的。
如果一个点的出边只有 \(n\),那么它的值一定为 \(0\),进而,如果一个点出边的 \(f_i\) 全是 \(0\),那么一定是 \(0\)。考虑从小到大扫描值 \(v\),确定 dp 值为 \(v\) 的位置集合。算法流程就是,每次拓展 \(S_{v-1}\to S_v\)。
那么确定 \(f_u=v\) 有两种方法: 如果存在一个还未确定的点,但它连了一个点满足 \(f_{x}<v\),此时可确定;首先在迭代前 bfs 确定根本无法到达 \(t\) 的点集 \(S\),如果一个点的 \(f\) 值未被确定且它可以通过未确定 \(f\) 值的点走到 \(S\) 中的某个点,那么可以确定这个点的 \(f\) 值 \(>v\),除此之外其余所有之前 \(f\) 值未被确定的点的 \(f\) 值均为 \(v\)。多源 bfs 即可。
答案的上界是 \(n\),因此最多做 \(n\) 轮,时间复杂度 \(\mathcal O(nm)\)。
D(最短路,dp,线段树合并)
预处理 \(1\) 为源点的最短路,找到 \(G\) 的最短路树 \(T\),发现断开的一定是 \(T\) 的树边。注意到一定是走到下一步前立刻断开这个位置的某条树边是最优的,并且在断开前是一直在 \(T\) 上往下走。令 \(F(u)\) 表示 \(u\) 断开 \((u,fa_u)\) 后到 \(1\) 最短路的最大值,最终每个点的答案为 \(G(u)\),有 \(G(u)=\max(F(u),\min_{(u,v,w)\in E}w+G(v))\),知道 \(F\) 后可以使用 dijkstra 求出 \(G\)。
考虑 \(F\) 断开后一定是通过某条边 \(x,y\) 离开子树 \(u\),满足 \(x\in subtree(u),y\not\in subtree(u)\),贡献为 \(\text{dis}_x+\text{dis}_y-\text{dis}_u+w\),需要取出最小值。 在树上扫描线,在 \(x,y\) 处加入,在 \(\text{lca}(x,y)\) 处撤销即可。或者直接线段树合并,时间复杂度 \(\mathcal O(n\log n)\)。
842. P3450(搜索,图的独立集)
直接在 dfs 的时候维护一个剪枝:如果当前看的点是独立集那么显然我们会选它。如果目前不被选择的点数量 \(t\) 超过 \(l=m-k\) 就直接剪枝,发现复杂度为 \(\mathcal O(2^mn)\)。因为 \(t\to t+1\) 是搜索树的二度点,而二度点数量 \(\leq l\)。
考虑度数 \(>l\) 的点,显然有它不被选入独立集,可以在一开始就删除所有这样的点。此时剩下的所有点度数都最多是 \(l\),这也意味着我们选一个点最多能覆盖 \(l\) 条边,那么边数上限就是 \(l^2\),而度数大于 \(0\) 的点数量上限则是 \(2l^2\)。结合剪枝,时间复杂度 \(\mathcal O(2^ll^2+n+m)\)。
843. P14516(结论推导,分治)
考虑怎么计算 \(f(b)\)。结论:每次操作的是下标奇偶交替的位置。将 \(b\) 的每个位置赋予 \(0/1\) 表示其原下标的奇偶,然后考虑缩成若干 \(01\) 极长连续段的形式,发现每个连续段在每次的子序列中至多贡献一个数,调整一下发现必然可以贡献一个数,因此每次是从每个连续段中选一个数 \(+1\)。进而,答案是所有连续段中,每个段 \(\sum b_i\) 的最大值。
取出原序列 \(a_i>0\) 的位置,将原序列的连续段缩到一起,假设有 \(m\) 段。考虑分治,此时对 \([1,m]\) 的子区间 \([l,r]\) 分治的意义是,\(b\) 最左侧涉及的段 \(\in[l,mid]\),另一侧同理。\(l=r\) 直接拆贡献即可。分治之后,对于两侧处理每个位置,只考虑到这里的 \(\max\)。最终贡献形如 \(\max(a_l,b_r)\),对于两侧跑一个双指针即可。由于是对段之间的分割点分治,所以可以直接拆贡献,时间复杂度 \(\mathcal O(n\log n)\)。
844. *P14515(状压,dp,搜索)
先不考虑图的特殊性质,将式子拆开,相当于每个点可以指定一条邻边,或者不指定直接给权值乘 \(t\),然后考虑所有被指定的边各自的概率的乘积。直接计算是 \(\prod(t+\sum p)\),令 \(P_u=(t+\sum p)\)。注意这会将一条被两个端点都指定边的贡献算成 \(p^2\)。考虑处理:\(f_S\) 表示 \(S\) 点集子图,内部没有重边的贡献;\(g_S\) 表示 \(S\) 点集不重不漏由一些重边覆盖的贡献,答案为 \(\sum f_Sg_{U-S}\)。求 \(f_S\) 可以容斥,注意只是限制内部没有,因此可以连向外部,转移形如 \(f_S=P_uf_{S-u}-\sum_{(u,v,w)\in E}f_{S-u-v}w^2\)。时间复杂度 \(\mathcal O(2^nn)\)。考虑另一种做法:状压所有点是否已经指定,依次插入所有边 \((u,v,w)\),然后确定是否给 \(u,v\) 钦定上,时间复杂度 \(\mathcal O(m2^n)\)。
考虑图的特殊性质,显然可以将每 \(k\) 个分为一块,逐块进行处理,直接记录状态,容易得到 \(\mathcal O(4^km)\) 做法。先处理完连 \(\leq 1\) 个下一层块的当前块的点。对于剩下的点,在其连接的两个点之间建立虚边来刻画二选一模型,形成了若干连通块,我们按非树边数量从大到小遍历每个连通块,访问一条边就处理其代表的上一层的点即可,复杂度为 \(\mathcal O(m2^k)\)。
845. P14510(结论推导,计数)
研究偶数长度的连续段可以自由移动事实上是不好刻画 \(S\) 的,考虑不研究连续段,而是研究 \(0\) 的变化。发现形如将 \(0\) 移动两个单位,并且跨过的是 \(11\)。注意到操作互逆,我们显然可以把一个串先贪心操作成一个等价形式(找代表元),由于 \(0\) 相对顺序不变,考虑逐个从左往右操作 \(0\),可以将 \(0\) 尽量移动到左边,此时形态为 \(\texttt{01001010}\cdots\)。此时再考虑判定一个集合 \(S\) 是否合法,每次找到最左边在 \(S\) 中的 \(0\),考虑将它和它后面的 \(0\) 都往右移动两格。如果某一步执行失败那么就是非法的。
令最后一个 \(0\) 的位置为 \(k\),那么向右移动的次数不能超过 \(m=\lfloor\frac{n-k}{2}\rfloor\)。发现每一步是否选择冲突与 \(S\) 是完全对应的,令 \(0\) 的个数为 \(v\),冲突的个数为 \(0\leq t\leq m\),贡献为 \(2^{n-v-t}\binom{v+t-1}{t}\)。答案即为将所有 \(t\) 贡献加起来。
考虑单点修改某个位置,发现对 \(m,v\) 的影响都是 \(\mathcal O(1)\),借鉴 [LNOI2022] 盒,考虑用类似于莫队的事情处理 \(m\to m-1,m+1,v\to v-1,v+1\) 的事件,发现是通过维护 \(\mathcal O(1)\) 个附近的值做到递推的。关于 \(k\),发现相邻两个 \(0\) 中间存在 \(1\) 当且仅当中间原来就隔着奇数个 \(1\),容易用 set 维护所有 \(0\) 的位置。视 \(n,q\) 同阶,总时间复杂度 \(\mathcal O(n\log n)\)。
846. P14522(贪心,结论)
注意到保留到最终的元素 \(x\) 一定是只被减过一次,考虑它减掉的那个元素 \(y\),一定是被消掉的位越多越好,因此对于所有不是 \(x,y\) 的元素,都让 \(y\) 减掉它,最终让 \(x\to x-y'\) 即可。枚举 \(x\),快速查询剩余元素中去掉 \(y\) 的 \(\text{or}\) 和,枚举 \(x\) 并预处理,再枚举 \(y\) 容易做到 \(\mathcal O(|S|^2)\) 求解 \(f(S)\)。注意到每次必然可以消掉一位,因此任意取 \(\log V\) 个元素就可以把 \(y\) 消成 \(0\)。这样在 \(|S|\ge\log V+2\) 时,一定有 \(f(S)=\max S_i\)。另一方面,在 \(|S|>3\) 时,可以说明取 \(x=\max S_i\) 一定是最优的,这样枚举量降到线性,可以 \(\mathcal O(|S|)\) 求 \(f(S)\)。
单调栈求出所有区间最大值之和,然后暴力计算所有长度 \(\leq \log V+2\) 的区间的答案,时间复杂度 \(\mathcal O(n\log^2V)\)。
847. P14523(线段树)
考虑 \(a_i>1\) 时,相当于每种质因数的幂次序列必须是单峰的。先仅考虑 \(a_i>1\) 的元素,对所有 \(l\) 求出最大的 \(r\) 使得 \([l,r]\) 内部提取 \(a_i>1\) 的元素拉出来是合法的。可以对于每种质因数分开做,双指针对每个非 \(1\) 连续段扫一遍。
再考虑 \(a_i=1\) 的元素,提取某种质因数,发现其如果在两个确定元素之间,考虑 \(l=p^a,r=p^b\),那么中间在 \(p\) 上的指数必然是 \([a,b]\) 值域的单调序列,这样容易组合数计算。所有跨过 \([l,r]\) 的子段都要考虑这个贡献。如果其作为端点,找到下一个 \(>1\) 的元素,那么是 \([0,v]\) 值域的单调序列,也容易计算。可以转化为一些矩形乘,以及查询矩形和,按照 \(l\) 进行扫描线,维护所有 \(r\) 的答案。扫描线过程中,对 \([l,f_l]\) 下放历史和标记即可。线段树维护,时间复杂度 \(\mathcal O(n\log n\log V)\)。
848. ARC210E(增量,背包)
魔改背包题,算法一定是基于正常背包的,所以不要想歪。增量插入每个元素,可以将已有的 \(S\) 与 \(S_i+x\) 取并。
观察答案的上界,并不会很大。令 \(L=nV\leq 5\times10^{16}\),令 \(k=1.01\),用类似于数论分块的方法每次将 \([l,kl]\) 的段分出来,每一段内部两个点不会成为答案。而段数是 \(\log_kL\) 的,这个数据范围不超过 \(4000\),可以接受。观察:每个段只关心落在其中的 \(\min,\max\),令每个块原始的区间为 \([L_i,R_i]\),内部 \(\min,\max\) 分别为 \(l_i,r_i\),那么只有 \((r_i,l_{i+1})\) 是备选答案。
那么直接将这些段作为状态,记录落在每一段内的 \(l,r\),以及方案数 \(F\)。每次转移枚举上一轮的一个段,转移到 \([l',r']\)。考虑 \(l',r'\) 不处于同一段时,显然可以将涉及的这些段全部并到一起,这样仍然是整段的转移。最终 check 一下所有 \((r_i,l_{i+1})\) 就好了。
时间复杂度 \(\mathcal O(n\log_kL)\)。
849. *P13508(转置,优化跳跃,分治)
显然对于同一个左端点存在单调性,即 \(i\) 可以直接跳到的 \(j\) 是 \([i+1,f_i]\) 中所有 \(a_j>a_i\) 的位置。按照值从小到大加入,一个 \(f_i\) 只要求内部所有 \(<a_i\) 的位置相邻差值不超过 \(d\),向集合中插入元素时维护这个条件是容易的,再使用数据结构可以求出 \(f\)。
研究询问,由于 \([i,f_i]\) 内可以到达的 \(a_j>a_i\) 的 \(f_j\ge f_i\),所以在跳跃过程中,可以取可达范围最大值,如果 \(\leq a_v\) 就直接跳,否则如果当前仍不可达 \(v\),则只能选取 \(\leq a_v\) 中的最大值。先考虑可达性,跳到第一个 \(>a_i\) 的位置,使用单调栈求出 \(nxt_i\),建树 \(i\to nxt_i\),然后对取值范围的管辖区间形成轮廓线,这样快进到包含 \(a_v\) 的区间,判由对应点可达即可,这样递归到子问题。\(t=2\) 的贪心与上述为了保证可达而一步一步跳的区别,发现由于是最大值,那么 \([i,f_i]\) 的最大值一定在 \(i\) 的祖先之中,因此这个策略在前期相当于一步当多步跳。取 \(\max\) 跳跃的树同样可以求出一个值域上管辖区间,同样可以快进到包含 \(a_v\) 的区间。
注意到上述分析中,值域更有利于定位,考虑转置维度,以值域为核心分析。直接值域分块,好处是指定了一个确定的 \(lim\),令块为 \([l,r]\),那么值 \(\ge l\) 的容易预处理,值 \(<l\) 的决策分为跳进块以及跳到 \(<l\) 的最大值,处理这个值跳进块可以达到的块内最小值 \(t_i\),若询问的 \(t_i\leq v\) 就说明该由这个位置跳入块中。建立 \(i\to fa_i\) 的树,按照询问的 \(v\) 从小到大扫描线,加入所有 \(t\leq v\) 的点并标记为黑点,那么 \(u\) 跳到第一个黑点之后根据 \(v\) 暴力查询下一步的决策,转化为块内的问题。精细实现,时间复杂度大概是 \(\mathcal O(n\sqrt n)\)。
将分块转为 polylog 通常是分治,考虑在猫树上递归,每次取出 \(L\leq l\leq mid<r\leq R\) 的询问,将分块中的“块”作为 \([mid+1,R]\),前面只处理到 \([L,mid]\),\(u\) 求出跳入块的决策后,继续在猫树上分治下去,这样每个询问至多在猫树上掉 \(\log n\) 次就求出答案。分块相当于多叉树,深度只有一层,但是可能的话可以变成完全二叉树,深度变为 \(\log n\)。时间复杂度 \(\mathcal O((n+q)\log^2n)\)。
850. P10071(Hall 定理,线段树)
假设确定了每种长度有 \(a_i\) 对等边,剩余 \(b_i\) 个拿来匹配等边,此时是否有解,是一个 Hall 定理的形式,要求 \(\sum_{i\in S}a_i\leq \sum_{i\in N(S)}b_i\),只需要令 \(N(S)\) 为一段前缀,\(S\) 取对应极长前缀,即所有 \(1\leq t\leq n\) 满足 \(\sum_{i=1}^{t}a_i\leq \sum_{i=1}^{2t-1} b_i\)。猜测:\(a_i\) 一定是一段后缀取满值,这样二分 \(\sum a_i\) 的值,容易得到 \(\mathcal O(nq\log S)\) 的做法。
先假设 \(a_i\) 是取满的,但此时不一定满足 Hall 定理,这样就要从前往后调整掉一些 \(b\)。将 \(a_i,b_i\) 交替放置,提取出前缀和最小值为 \(t\),显然最终要求 \(t\ge 0\)。结论是要反悔掉最前面的 \(\lceil\frac{-t}{3}\rceil\) 对等边。维护一棵单点加,整体求前缀和最小值的线段树,时间复杂度 \(\mathcal O(n\log n)\)。
851. P9104(调整分析,线段树)
这是一个二分图,而二分图最大匹配等于,点数减去最大独立集大小,因此我们转为求最大独立集,即: 选若干格子,要求同一行同一列被选出的格子上的数字相同。
贡献形如选出行列集合 \(S,T\),要求 \(S\) 中的行以及 \(T\) 中的列上的格子均是 \(0\),其余行列就是 \(1\)。如果 \(a_{i,j}=0,i\in S,j\in T\) 或者 \(a_{i,j}=1,i\not\in S,j\not\in T\) 那么就会对答案产生 \(1\) 的贡献。固定集合 \(T\),令 \(S\) 为空然后进行调整,对于行 \(i\) 将其加入集合 \(S\),此时会产生的变化量是 \(c_i=\sum[a_{i,j}=0\wedge j\in T]-[a_{i,j}=1\wedge j\not\in T]=|T|-\sum [a_{i,j}=1]\)。因此求出 \(c_i\) 表示第 \(i\) 行 \(1\) 的个数,贡献只与 \(|T|\) 有关,以及处理 \(d_j\) 表示第 \(j\) 列 \(1\) 的个数。
枚举 \(x=|T|\),\(S\) 为空时 \(T\) 就是前 \(x\) 小的 \(d_j\)。因此最终答案就是 \(\max_{x=0}^n\{\sum_{i=1}^n\max(0,x-c_i)+\sum_{i\leq x}d_i\}\)。扫描线求出 \(c,d\),每次单点修改只修改 \(\mathcal O(1)\) 个 \(c,d\),线段树维护所有 \(x\) 的答案,时间复杂度 \(\mathcal O(n\log n)\)。
852. *CF1784F(结构分析,计数)
首先研究一个集合 \(S\) 是否合法,转化成补集,显然有 \(|S|=2k\),并且形成若干长度为偶数的连续段。注意到当第 \(i\) 次操作为操作 \(2\) 时,大的那个一定是 \(n+i\),与前序操作无关,所以被删的数最大值不超过 \(n+k\)。
猜测第一个极长连续段一定全部被操作 \(1\) 删掉,否则调整是不影响的。注意到,删除的位置全部 \(\ge n\),且 \(n,n+1\in S\) 时,无论如何都是可以形成 \(S\) 的,具体来说直接按照 \(S\) 两两配对,每次取出来最左边的对,使用操作 \(1\) 进行移位即可。拓展一下,操作 \(1\) 会导致中线向右偏移,发现 \([1,n]\) 中除去第一个连续段至多只能剩下一个连续段,进一步发现是一段后缀,再分析会发现,令左侧第一个连续段之后首个 \(\leq n\) 被删除的位置为 \(p\),则 \([p,2n+1-p]\) 都要被删除,然后就转化成上面的问题。
枚举第一个极长连续段的长度以及 \(p\),递推计算一下组合数求和即可。时间复杂度 \(\mathcal O(n)\)。
853. CF1209G2(线段树)
\(q=0\) 做法:对于每种颜色保留其最早和最晚的出现位置 \([l_i,r_i]\),将 \([l_i,r_i]\cap[l_j,r_j]\ne\varnothing\) 的 \((i,j)\) 连边,答案为每个连通块的 \(\max occ_i\) 求和。有一个显然的线段树分治做法,没什么意义。
考虑相交的段如何快速刻画,注意到 \([p,p+1]\) 被割开当且仅当所有线段都不覆盖 \([p,p+1]\)。将这些 \(p\) 找出来,则原序列分割成若干段。由于无法进一步割开,那么每一段就是一个连通块,求完整落在某一段中的区间的 \(\max occ_i\) 即可。考虑将 \((l,occ)\) 放在 \(l\) 上作为其贡献,转化为 \(0\) 的位置断开了若干段,每段的贡献是每个点权值的最大值。每次都是单点修改,直接上线段树维护,虽然直接维护 \(0\) 是困难的,可以维护区间最小值作为分界点,这样就容易合并了。时间复杂度 \(\mathcal O(n\log n)\)。
854. qoj14817(调整解集,凸包)
调整解集,注意到 \([l_i,r_i]\) 单调,我们声称最终一定满足 \(a_i\) 单调不降,否则一对逆序对直接交换仍然符合条件。另一方面,也不会出现形如 ABBA 的分组,因此就是直接按照 \(\bmod k\) 进行分组。这样可以看成 \(k\) 个独立的子问题,不妨设 \(k=1\)。
给定 \(d\) 判是否合法:考虑构造序列 \(x_i\),满足 \(x_1=l_1,\forall i>1,x_i=\max(x_{i-1}+d,l_i)\),限制为全部 \(x_i\leq r_i\)。将 \(\max\) 展开,转化为 \(\forall i<j,l_i+(j-i)d\leq r_j\),转化为 \(r_j-jd\ge l_i-id\)。考虑区间询问 \([l,r]\),可以拆分为 \(\log n\) 个线段树节点或者进行猫树分治。对于后者直接维护一个动态凸包(李超树),判 \(i,j\) 完成落在 \(L,R\) 以及分别落在 \(L,R\) 的情况,容易 \(\mathcal O(n\log^2n)\)。
对于线段树节点,讨论 \(i,j\) 是完整一个子树还是从某个子树中取,这样需要最小化和最大化,这个离线后按照 \(d\) 排序,在子树的凸包上维护一个指针即可;考虑一个完整子树,合法的 \(d\) 是一段前缀,观察 \(d\leq\frac{r_j-l_i}{j-i}\),发现就是斜率。归并左右子树的凸包,用一个指针维护左边每个点对应的切线就能线性合并。时间复杂度 \(\mathcal O(n\log n)\)。
855. CF2165D(二分图,贪心)
显然每条边连接的两个值奇偶性不同,写成一个二分图的形式,拆成入点和出点,相当于奇偶分别独立。令 \(G_1\) 上左部图是值奇数的位置,\(G_2\) 则反过来。那么左部图所有点向右部图所有 \(v-1,v+1\) 且位置更大的位置连边,需要求出 \(G\) 的最大匹配。
直接按照左部图的 \(v\) 从小往大贪心找匹配,优先找 \(v-1\) 中它的后继匹配,然后找 \(v+1\) 的匹配。发现按值域贪完没有增广路。直接用 set 维护每个点的位置,时间复杂度 \(\mathcal O(n\log n)\)。
856. CF2165E(结构分析,树)
改成限制答案上界为 \(d\),最大化使用的颜色数量。
注意到,每个颜色必然是连通块,否则交替之后调一下不劣。考虑 \(ans=2\) 的情况,取出原图度数最大的点 \(x\),向不同方向的子树每个染一种颜色即可。考虑 \(ans=3\),取一个点 \(x\) 之后,相当于要在一个子连通块中选取另一个度数比较大的点 \(y\),在 \(x\to y\) 的子树部分染同一种颜色,然后每个方向各自贡献一个颜色。再考虑 \(ans=4\),发现一定存在一个点 \(x\),再染每个方向,使得每个子树 \(\leq 2\) 种。
猜测关于染色形态的结论,类似于树的直径:\(d\) 为偶数时,存在一个中心点 \(r\),使得每个点到 \(r\) 的权值都 \(\leq \frac{d}{2}\);\(d\) 为奇数时,存在一个中心连通块,使得块内边颜色都相同,并且每个点到这个连通块的权值都 \(\leq \frac{d-1}{2}\)。考虑剥叶子,对于 \(d\) 为奇数去掉最外面 \(\frac{d-1}{2}\) 层的叶子,对于 \(d\) 为偶数去掉最外面 \(\frac{d}{2}-1\) 层叶子之后求一下最大度数即可。
时间复杂度 \(\mathcal O(n\log n)\)。
857. 20251118 模拟赛
NKheyuxiang/tuu
A(高维前缀和,容斥)
对于两个数,枚举最高的不同位,则 \(h(x)\) 会 \(+1\) 的 \(x\) 满足该位为 \(0\),某些位必须是 \(1\)。将这一位容斥掉,变成没有限制减掉,必须为 \(0\),做高维前缀和即可统计贡献,时间复杂度 \(\mathcal O(nm+m2^m)\)。
B(区间 dp)
判定合法只需要若将 \([i,i+a_i−1]\) 看作区间,判定是否相离包含。从保留区间的角度,则 \(H(l,r)\) 即为在 \(l+1,r\) 选最多相互包含或不交的区间再加上 \(a_l\) 是否要改。
直接区间 dp,复杂度 \(\mathcal O(n^3)\)。注意到普通的枚举分割点相当于令其的合并形态是二叉树,但是本题中关键的树只有 \(\mathcal O(n)\) 个(即每个区间内部的信息),最终形态一定是若干棵树并排放,因此每次在左侧接上新的树即可。设 \(f_{l,r}\) 表示 \([l,r]\) 森林点数最大值。当 \(r\ge l+a_l\) 时可以用 \(f_{l,l+a_{l−1}+1}+f_{l+a_l,r}\) 转移。时间复杂度 \(\mathcal O(n^2)\)。
注意内存访问连续性。
*C(构造,平衡复杂度)
设 \(a\) 中非零数有 \(A\) 个。\(b\) 中非零数有 \(B\) 个。
- 做法 1:先清空 \(1\),将 \(a_i<b_i\) 以及 \(a_i>b_i\) 分开,每次取一个 \(a_i>b_i\) 向 \(1\) 转移,再向 \(a_i<b_i\) 位置转移,上界 \(2(n−A)+n−B\)。
- 做法 2:先将所有水倒进 \(n\),再往前推,这样所有 \(a_i=1\),此时再满足 \(b\) 即可。次数上界 \(A+n−1+n−B\)。
- 做法 3:先将所有水倒进 \(n\)。之后从大到小枚举 \(i\),若 \(b_i>0\),则从 \(n\) 倒给 \(b_i\) 位置,再倒给 \(i\) 位置。次数上界 \(A+2B\)。
此时当 \(B=n\) 就能平衡做法 1,2 做到 \(\frac{4}{3}n\),加入做法 3 发现任意的 \(A,B\) 都能通过某种方式做到 \(\frac{5}{3}n\)。
D(dp,状态设计,线段树合并,数量分析)
考虑 \(k=2\),注意到如果向下延一条边,那么对于下面的子树 \(u\),其中一个颜色已知就是 \(a_{fa_u}\),容易有以下状态设计:\(f_u\) 表示 \(u\) 子树的答案,\(g_u\) 表示 \(u\) 连通块的颜色是 \(\{a_u,a_{fa_u}\}\) 的子集的方案数。转移讨论 \(u\) 的另一种颜色,转移复杂度 \(\mathcal O(n)\)。
拓展到 \(k=3\),在 \(g\) 的基础上拓展,设 \(h_{u,i}\) 表示 \(u\) 连通块的颜色是 \(\{a_u,a_{fa_u},i\}\) 的子集的方案数,并且 \(i\) 只有在子树中出现才是有用的。使用动态开点加线段树合并维护 \(h\) 即可。
先将颜色相同的儿子合并。考虑 \(f_u\) 的转移:根据 \(u\) 所在连通块颜色数讨论,不超过两种是简单的。当有三种颜色时,可能会有 \(h_{a,c_b}\) 和 \(h_{b,c_a}\) 需要相乘。但可以发现,除了颜色等于 \(c_{fa_u}\) 的儿子,将其他儿子的 \(h\) 暴力枚举时间复杂度依然是 \(\mathcal O(n)\)。因为若 \(x\ne c_{fa_u}\) 则 \(h_{v,x}\) 将不会向上合并,也就是说只会在 \(fa_u\) 处被考虑,再往上就不会考虑,而每个儿子 \(x=c_{fa_u}\) 只会有 \(1\) 个。\(g,h\) 转移也是简单的。
线段树合并大概需要维护 \(ax+b\) 之类的标记,时间复杂度 \(\mathcal O(n\log n)\)。
858. qoj9687(仙人掌,反悔贪心,dp)
注意到对于同一个位置,交换相邻两项不会对总贡献产生任何影响,因此每个点的贡献只与相邻黑边个数有关,有 \(n\) 条邻边其中 \(k\) 条染黑时,产生 \(g(n,k)=p\frac{nk(n-k)}{2}\) 的贡献。
考虑树的做法,直接在上面 dp:设 \(f_{u,0/1}\) 表示 \(u\) 子树中 \((u,fa_u)\) 是否染黑的最大收益。转移形如,选 \(k\) 个取 \(f_{v,1}\),剩下的取 \(f_{v,0}\),最大化 \(\sum f_{v,i}\)。这是经典贪心,先取所有 \(f_{v,0}\),然后选 \(k\) 个 \(f_{v,1}-f_{v,0}\) 最大的位置即可。进一步考虑边仙人掌的做法,首先建立圆方树,然后考虑环的问题怎么处理,注意到方点的儿子顺序对应的就是环的顺序,取出方点的父亲圆点 \(u\) 以及在这个方点的邻边 \(x,y\),发现只关心 \(x,y\) 是否被选。再考虑下面的儿子,顺时针做一个 \(2\times 2\) 的矩阵乘法状物:记录首条边,它上一条边是否被选的状态,然后讨论下一条边是否被选。因此转移的重点依然在圆点的统计,需要对于邻接圆点,方点决策,这是一个比树部分更复杂的贪心。
问题转化:长度为 \(m\) 的物品集合,每个物品可以决策产生 \(1\) 的重量并且收益为 \(a_i\),或者 \(2\) 的重量并且收益为 \(b_i\),或者直接不选。需要对所有 \(k\) 求出重量恰好为 \(k\) 的最大收益。
对于 \(a_i<b_i-a_i\) 以及 \(a_i\ge b_i-a_i\) 讨论。对于后者发现可以拆成两个重量为 \(1\) 的独立物品。由于重量很小,经典结论是先考虑按照性价比贪心后,最终需要调整的部分很少。那么在此策略选 \(a\) 后一定会立刻选 \(b_i-a_i\),因此组合成 \(\frac{b_i}{2}\) 性价比的物品。按照性价比排序后,考虑 \(\ge k\) 的最小前缀和,如果是 \(k\) 那么一定最优,否则是 \(k+1\),只会删除已选重量为 \(1\) 的 \(\min(v_i)\) 或者删除重量为 \(2\) 的 \(\min b\),并加入未选取中重量为 \(1\) 的最大收益的物品。这样容易对所有 \(k\) 求出答案。这个子问题只需要排序,可以 \(\mathcal O(m\log m)\)。
视 \(n,m\) 同阶,原问题容易做到时间复杂度 \(\mathcal O(n\log n)\)。
859. *qoj6284(分类讨论,状压)
先认为每个路径至少经过一次颜色间的切换,最后再重新考虑最短路仅使用铁路的情况,这一部分可以暴力处理,只有 \(\mathcal O(nk)\) 种。考虑路径形态,发现代价不超过 \(2k-1\),形如 \(a\to(a)\to b\to b\to c\to c\to(d)\to d\)。显然一个颜色不会经过超过两次,并且如果有两次一定是相邻出现,并且是经过铁路来切换。
对所有颜色对 \(a,b\),处理一个 \(a\) 到任意一个 \(b\) 中的位置 \((u,v)\) 中,最小的最短路 \(F(a,b)=d(u,v)\),注意这里计算一下初始 \(a\) 内部跳跃的代价。有 \(d(x,y)\in[F(col_x,col_y)-1,F(col_x,col_y)+1]\),即这里 \(F\) 的路径形如 \(a\to a\to b\to b\to c\to c\to d\)。加速铁路跳跃的决策:枚举 \(n\) 个起点,向左右拓展极长互不相同的路径,这样相邻不同决策只有 \(k^2\) 个,对于每种颜色拆入点和出点,形成一个 \(2k\) 个点的图,令 \(w(x,y)\) 为 \(out_x\to in_y\) 的边,是 \(col_x,col_y\) 在铁路上的最短路。跑一个全源最短路即可求出 \(F\)。
考虑先认为 \(d(u,v)=F(col_u,col_v)+1\),然后修正 \(d(u,v)=F(col_u,col_v)\) 以及 \(d(u,v)=F(col_u,col_v)-1\) 的贡献。
- \(F(col_u,col_v)-1=d(u,v)\),路径形如 \(a\to b\to b\to c\to c\to d\)。要求 \(u\) 在铁路上到颜色 \(b\) 的最短路恰好就是 \(w(a,b)\),\(v\) 同理。有 \(F(a,d)=F(b,c)+w(a,b)+w(c,d)+2\)。处理 \(u\) 的颜色集合 \(S_u\) 使得 \(\forall i\in S_u\),其到铁路上最短路恰好是 \(w(a,i)\)。转化为:存在 \(b,c\) 使得 \(b\in S_u,c\in S_v,F(a,d)=F(b,c)+w(a,b)+w(c,d)+2\),后者可以转化为所有 \((a,b,c,d)\) 对是否合法。枚举 \(u,d\) 后,可以求出一个 \(c\) 的集合 \(P\),那么要求 \(S_v\cap P\ne \varnothing\),转化为补集预先高维前缀和即可。复杂度 \(\mathcal O(k^4+nk+2^kk^2)\)。
- \(F(col_u,col_v)=d(u,v)\),形如 \(a\to b\to b\to c\to c\to d\to d\),或者 \(F(b,c)+w(a,b)+w(c,d)+3=F(a,d)\)。情形类似。
时间复杂度 \(\mathcal O(k^4+nk+2^kk^2)\)。
860. CF2165F(支配对,扫描线)
显然 \([l,r]\) 合法一定有 \([l-1,r],[l,r+1]\) 合法,这样求出来每个 \(l\) 最小的 \(r\) 合法即可,答案为 \(\sum n-f_i+1\)。
注意到子序列 \(21435\) 显然要拆开。固定 \(2\) 的位置 \(i\),一定是找下一个 \(a_j<a_i,j>i\) 作为 \(1\)。放到坐标系 \((i,a_i)\) 上,转化为 \(x\in[j+1,n],y\in[a_i+1,n]\) 的部分中的一个 \(213\) 子序列,范围即为一个 2-side 矩形。
考虑枚举这个子序列中 \(1\) 的位置 \(p\),注意枚举 \(2\) 的话这里就会有很多 \((2,1,3)\),考虑枚举 \(3\) 的位置 \(q\),如果并非 \([p+1,n]\) 中的前缀 \(\max\) 那么就会被前面那个点支配掉。令 \([p+1,n]\) 中所有前缀 \(\max\) 并且 \(>a_p\) 的位置分别为 \(r_1,r_2,r_3,\cdots\)。如果最终取的是 \(r_2,r_3\) 之类,那么取的 \(2\) 的值一定 \(>a_{r_1}\),那么 \(p\) 可以移动到 \(r_1\),并且范围更大,因此只需要考虑 \(a_{r_1}\) 为 \(3\)。对于 \(r_1\) 显然可以用单调栈找。此时找前缀最后一个落在 \([a_p,a_{r_1}]\) 的点作为 \(2\) 即可。综上,只有 \(\mathcal O(n)\) 个有效的 \(213\) 子序列。
转化为:\(n\) 个带点权的点,查询的是 \(n\) 个 2-side 矩形内部点权 \(\min\)。容易扫描线解决,时间复杂度 \(\mathcal O(n\log n)\)。
861. 20251119 杂题选讲
A. AGC025E(树剖,欧拉回路)
处理出每条边的覆盖次数 \(f_i\),答案上界显然是 \(\sum\min(2,f_i)\),猜测一定可以取到。对第一个路径任意定向,对路径上 \(f\) 减一。然后找到 \(f_e=1\) 的边,这些路径的虚树是链,因此可以用它们直接确定方向是不冲突的。用一个类似于拓扑排序的过程做即可,使用树剖加数据结构加速可以得到时间复杂度 \(\mathcal O(n\log^2n)\) 的做法。
Solution 2:加强条件为给每次散步定向,使得每条边两种方向被覆盖次数差不超过 \(1\)。可以用欧拉回路的手法。
B. qoj401(根号分治)
\(d(x)=\prod(k+1)\),确定质因数 \(p\),有 \(v_p(\binom{n}{m})=v_p(n!)-v_p(m!)-v_p((n-m)!)\)。考虑对 \(p\) 根号分治。
- 对于 \(p^2\leq N\) 的质数,可以暴力维护 \(v_p(n!)\),对于每个 \(p\) 直接筛,以及 \(q\) 次单点查,可以根号平衡,能分析到 \(\mathcal O(\frac{q\sqrt n}{\log n})\)。
- 对于 \(p^2>N\) 的质数,有 \(v_p(n!)=\lfloor\frac{n}{p}\rfloor\),此时有 \(v_p(\binom{n}{m})\in[0,1]\),每个 \(p\) 对 \(cnt\) 的贡献就是 \(\lfloor\frac{n}{p}\rfloor-\lfloor\frac{n-m}{p}\rfloor-\lfloor\frac{m}{p}\rfloor\),直接预处理前缀和,最终答案乘以 \(2^{cnt}\) 即可。
C. *qoj14419(折线计数,双射构造,反射容斥)
考虑 \(x\to \max(0,x+a_i)\) 的折线,最大子段和 \(\leq k\) 等价于限定折线最高点 \(\leq k\)。如果没有对 \(0\) 的 chkmax,那么是平凡的双直线反射容斥,考虑怎么处理对 \(0\) 的 chkmax,对原来的 \((x,y)\to (x+1,y+1),(x+1,\max(0,y-1))\) 太没救了。
做法是,每穿过一次 \(y=-\frac{1}{2}\),就对折线后面的部分反射一次。这样原来的折线就被唯一地双射到一条 \((x,y)\to (x+1,y+1),(x+1,y-1)\) 的折线上,通过新折线 \((x,0)\to (x+1,-1)\) 以及 \((x,-1)\to (x+1,0)\) 的位置来反射出原折线。对新的折线计数是容易的,限定不穿过 \(y=k+1\) 以及 \(y=-k-2\) 即可。对于所有 \(k\) 做复杂度是调和级数,时间复杂度 \(\mathcal O(n\log n)\)。
有手法做到 \(\mathcal O(n\log\log n)\)。
D. *CF2109F(二分,正难则反,网格图)
首先可以用二分加并查集求出 \(d_M\)。考虑二分 \(d_F\) 必须 \(\ge mid\),将 \(\ge mid\) 的格子看成黑色。先不考虑 \(d_M\) 的限制。和 qoj9224 比较像,从割的角度思考,相当于必须存在 \((n,1)\to (r,n)\) 的路径经过黑格子,转化成一条八连通,从下边界以及右边下半边界出发,到剩下边界的一条路径。再带上每个点修改成黑格的代价,此时是一个多源最短路,直接 dijkstra 即可。
再加上 \(d_M\) 的限制,如果 \(mid\leq d_M\) 那么不用管,否则这个路径不能把 \((1,1)\) 和 \((r,n)\) 割开。考虑对于 \((1,1)\to (r,n)\),找一条尽量靠上的折线,根据这条折线修改 \(d_F\) 那条路径的范围的边界即可,时间复杂度 \(\mathcal O(n^2\log n\log V)\),瓶颈在于最短路。
E. CF2162H(01,转换研究对象,dp)
固定 \(x\),所有数只分为 \(<x,=x,>x\),分别记为 \(0,1,2\)。那么每个区间全 \(\leq 1\) 或者全 \(\ge 1\),分别记为 \(A,B\) 类区间。你发现这里确定好 \(A,B\) 类区间的分配之后限制比较明确,考虑确定好所有区间的种类后,令 \(i\) 有 \(c_i\) 个,只被 \(A\) 覆盖有 \(a\) 个,只被 \(B\) 覆盖有 \(b\) 个,不被覆盖的位置有 \(t\) 个,限制为 \(c_0\leq t+a\wedge c_2\leq t+b\wedge c_0+c_2\leq a+b+t\),这样对 \(a,b,a+b\) 的限制分别是定值,并且问题重点就迁移到 \((a,b)\) 的刻画上。将合法的 \((a,b)\) 放在平面上,合法的区域是右上部分一个单调区域。
考虑 dp,固定 \(a\) 时最大化 \(b\) 的个数,这个就与 \(x\) 具体的值无关。转化为对位置钦定 \(A,B\),这样要求不存在某个区间同时含有 \(A,B\)。直接对 \(1\sim n\) 的位置的 \(ABx\) 串做 dp,并记录当前 \(A\) 的个数 \(a\),值为 \(f_{i,a,A/B}=\max b\)。假设当前位置决策为 \(A\),如果上一个钦定的位置是 \(A\) 那么可以直接转移(前面的位置限制显然更严),否则上一个位置钦定的是 \(B\),可行的转移位置是一段前缀。
使用前缀 \(\max\) 优化对位置的枚举,时间复杂度 \(\mathcal O(n^2+m\log n)\),后者是需要求出覆盖每个点区间的最小 \(l\)。
另一个 dp 过程中的思路:显然被包含的区间无用,可以去除。接下来认为 \(l,r\) 分别严格单调递增,从 \(i-1\) 转移到 \(i\) 讨论交集即可。
to do
ucup season3
PA2024.
posted on 2025-11-19 15:18 nullptr_qwq 阅读(3) 评论(0) 收藏 举报
浙公网安备 33010602011771号