杂题 day2
复习:
A
直接上线段树或者 ODT 即可。
B
一个区间的 \(\text{mex}\) 是 \(x\) 说明
\(0\sim x-1\)都在这个区间里,\(x\) 不在。
\(x\) 被所有的 \(\text{mex}\) 大于 \(x\) 的区间包含,不被 \(\text{mex}=x\) 的区间包含。
\(x+1\) 的区间要么包含 \(x\) 的区间,要么和 \(x\) 的区间无交,因此从小往大贪心就是对的。
C
左边放能力值,右边放 team,那么这个就是一个二分图。
从小往大贪心对能力值进行优先地匹配,即可得知 \(\text{mex}\) 的最大值。
将删除倒序改为插入,每次在上次的基础上继续匹配即可。
D
板子。
可以用莫队,或者持久化线段树维护每个数出现的最晚时间,查询最小的在区间前出现的数即可。
E
mex 和 xor 并没有显然的性质,考虑可行性 dp。
设 \(f_{i,j}\) 表示前 \(i\) 个数能否表示出 \(j\),\(n^3\) dp 是显然的。
考虑能否优化这个东西,有一个叫“极小mex区间的东西”,意思是不存在被它包含的区间mex等于他,结论是极小mex区间最多只有 \(2n\) 个。
证明:
假设有一个极小 mex 区间 \([l,r]\),他的 mex 不等于 \(0\)。
假设 \(a_l>a_r\),\(a_l\) 不等于 \(a_r\),否则删去一个一定不劣。
\(\text{mex}(l,r)\) 肯定大于 \(a_l\),因为不能等于,小于的话把 \(l\) 踢出去肯定不劣。
我们假设存在另一个极小 mex 区间 \([l,p]\),且 \(a_l>a_p\)
由于 \(\text{mex}(l,r)>a_l>a_p\) ,所以 \(a_p\) 肯定在 \([l,r]\) 中出现过。因此 \([l,p]\) 肯定不是极小 mex 区间。
所以一个 \(x\) 作为左右端点之多只会分别贡献一次。
那么我们发现 mex 一样的时候,取用更小的肯定不劣。
那么我们只把极小 mex 区间拿出来 dp,就是对的啦
F
考虑设 \(g_i\) 表示包含 \(0\sim i\) 之间所有数的路径数量
那么 mex 为 \(k\) 的路径数量就是包含 \(0\sim k-1\) 但是不包含 \(k\) 的路径数量,也就是 \(g_{k-1}-g_k\)。
那么假如我们建出点 \(0\sim k-1\) 的虚树(其实并不用真的建出来啦),假如这个树的形态是一个链,答案就是链两端的子树大小之积。假如不是,答案就是 \(0\)。
具体实现的时候可以 \(0\) 为根建树,然后维护链两端的编号,可以做到 \(O(n)\)。
G
把 \([i,j]\) 的 mex 值放在平面上 \((i,j)\) 点上。
先预处理出右端点在 \(n\) 的区间的 mex 值,然后考虑从最后一个开始删除。
假设删除了一个 \(k\),那么从 \(k\) 到 \(pre_k+1\) 中间的所有 \(>k\) 的 mex 数都变成 \(k\)。
这个可以用珂朵莉树维护,显然均摊 \(O(n)\)。
把珂朵莉树过程中每一个区间的存活时间看做一个矩阵,那么从左下角到右上角的(区间长度)值就是能贡献到的范围。
按区间长度从小到大扫描线,过程中维护 mex 即可。
H
考虑判定答案能否为 \(k\),那么假如我们删除了边权等于 \(k\) 的边后,图仍然联通,那么我们就可以说(最小mex生成树的)mex 肯定不大于 \(k\)。
于是可以线段树分治,每次递归一边插入另一边,过程中用带删并查集维护即可。
I
考虑你有两种方式减小答案,一种是往 mex 的位置(这个位置上没有数)移一个数过去,那么 mex 会至少增加 1。
另外一种是把大于 mex 的数移走,相同的要全部移走,答案会减少 1。
因此使用第一个操作肯定是不劣的。先算出 mex 最大能是多少,然后把大于 mex 的贪心尽量往下移即可。
J
首先如果路径里有 0 或者 1,那么就不可能出现 2。
然后开 32 个并查集,如果边权上有一位是 1,那么就在对应的并查集上连接两个端点。
如果查询的两个点在某个并查集上联通,那么答案就是 0。
否则只要有一条路径上没有 1,答案就是 1.
那么我们在每一个并差集上额外把每个边权末位为 0 的边两端和虚点 0 连接。
那么我们的点 u 只要能和 0 联通,那就说明可以通过一些(按位与不为 1)的边,然后通过末位为 0 的边就能保证之后不出现 1 这个数,那么答案就是 1,(如果答案已经不是 0 了)。
否则就是 2。
K
不知道,场上切了,直接考了。
L
不知道,场上切了,直接考了。
M
每次操作可以把 \([l,r]\) 覆盖成 \(\text{mex}(l,r)\)。
我们猜测并发现,存在一种构造性的解,使得 \([l,r]\) 最终能够被覆盖为 \(r-l+1\)
给出一种构造:
令 \(f(l,r)\) 表示对区间 \([l,r]\) 执行一次操作,\(g(l,r)\) 表示把区间 \([l,r]\) 变成 \(1\sim r-l\) 的排列。
那么 \(g(l,r)\) 的操作可以被表示为 \(g(l,r-1),f(l,r),f(l,r-1),g(l,r-1)\)。
手摸一下可以发现这很对。
那么我们先把整个区间覆盖成 0,接着 \(g(l,r-1)\),然后再 \(f(l,r)\) 一下就可以把整个区间覆盖成 \(r-l+1\)。
那么我们直接区间 dp,找出哪些区间被覆盖成 \(r-l+1\) 比原来更优,直接构造就可以啦~
N
先把整个序列复制两遍,环就可以转化为序列问题。
扫描线,扫描区间的左端点,维护每个右端点上的 mex 值,将左端点右移一位时,需要删除原来的左端点,然后插入一个新的长为 n 的区间。
删除的这个点相当于所有区间的 mex 都对这个点的值取 min。
维护可以选用吉司机线段树,\(O(n\log^2n)\),或者可以注意到 mex 单调不减,那么可以直接在线段树上二分,\(O(n\log n)\)。
O
发现满足每个 mex 的区间都存在的条件的序列,肯定是下凸的,也就是先单调下降,然后单调上升。
具体证明可以看原题解。
那么每个 \(0\sim k\) 的存在区间都是一个连续的长为 \(k+1\) 的区间。那么设 \(f_{i,j}\) 表示 \(0\sim i\) 的区间位于 \([j,j+i]\) 的区间数量,直接 dp 即可。
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/18774822

浙公网安备 33010602011771号