多校A层冲刺NOIP2024模拟赛06
T 小 Z 的手套(gloves)
签到题
答案显然具有单调性,排序后二分答案即可。
T 小 Z 的字符串(string)
签到题
注意到 \(n\) 较小,可以使用 \(O(n^3)\) 的算法,直接上大 \(DP\)。
设计状态 \(f_{i,j,k,0/1/2}\) 表示从左往右填到 \(i\) 位,已经填了 \(j\) 个 \(0\),\(k\) 个 \(1\),且第 \(i\) 位为 \(0/1/2\) 时所需最小花费。
转移直接大分讨即可,注意交换的过程中位移是相对的,每一次交换移动是双向的,所以目的位置具有一个偏移量,可以提前预知,所以最后直接交换的答案应减半。
T 一个真实的故事(truth)
线段树,分块
类似山海经直接合并即可。
全局查询竟然是 \(O(1)\),竟然不用考虑平衡复杂度!
时间复杂度瓶颈在修改操作为 \(O(qklogn)\)。
口胡一个在线跟 $k$ 无关做法
首先有一个 naive 的想法,对每个点维护所有颜色在它右边第一次出现的位置,将它视作答案的左端点则右端点为这些位置中的最大值,然后注意到很多点的某些颜色的第一次出现的位置其实是同一个位置,利用这个性质。
考虑分块,整块维护块内点所用位置第一次出现统一颜色的位置,块内单点维护不同第一次出现颜色的位置,这个可以用 set 维护,然后对每个块建一颗线段树直接维护每个点的答案(只计算自己独立最大的位置)支持区间查询最小值。
以下统一记 len 为块长, t 为块的个数。
初始化 会对每个块遍历一次所有颜色,直接硬塞即可,时间复杂度为 \(O(ktlogn)\)。
修改 注意到本质上是区间修改变动颜色前驱到该位置之间块的公共颜色,以及前驱和该位置所在块的独立颜色,时间复杂度为 \(O(lenlogn)\)
答案查询 遍历所有块,二分第一个独立颜色小于公共颜色的点然后更新答案,再在线段树上插叙这个点以右的最小值更新答案,时间复杂为 \(O(tlogn)\)。
当 \(t,len\) 相等时理论复杂度最优为 \(O(n\sqrt n logn)\),但由于常数原因个人感觉将块长调大一点实际会更好。
懒得写了 ...摆摆摆摆
T 异或区间(xor)
笛卡尔树,启发式合并,trie,RMQ,分治
全是套路。
考虑弱化小于等于 max 的限制,即考虑每个值所能影响的区间,由此想到到在笛卡尔树上分治。具体的每次找到当前区间的最大值设为 \(mid\),然后分别 \([l,mid-1],[mid+1,r]\) 进行分治,合并的时候由于和左右区间长度不一样,考虑使用较小的区间去算贡献,然后时间复杂度就变为了启发式合并的时间复杂度。考虑怎么算贡献,建一颗 trie 树,维护前缀异或和,每次计算异或上一个值(即能表示区间异或和)且小于等于每一个值的个数,板子直接套就行了。trie 树更新同启发式合并,把少的往多的插,然后继承给父亲即可。
时间复杂度为 \(O(nloglogV)\)。