杂题20200928
GYM102412D The Jump from Height of Self-importance to Height of IQ Level
给定一个长为 \(n\) ( \(n\leq1.2\times10^5\) ) 的排列 \(p_i\) ,执行 \(q\) ( \(q\leq1.2\times10^5\) ) 次操作,每次操作是取出一个区间并插入另一个位置。在每次操作后,回答排列中是否存在长为 \(3\) 的上升子序列。
考虑用平衡树维护序列
假设我们要合并 \(k\) 的左儿子 \(L\) 与右儿子 \(R\) ,先不考虑节点 \(k\) 的贡献
我们需要找到 \(L\) 中,所有长为 \(2\) 的上升子序列 \((x_1,\ x_2)\) 中, \(x_2\) 最小的那个,若右儿子 \(R\) 的最大值 \(mx\) 大于 \(x_2\) ,则存在长为 \(3\) 的上升子序列 \((x_1,\ x_2,\ mx)\)
对于 \(R\) ,我们同理考虑所有长为 \(2\) 的上升子序列 \((y_1,\ y_2)\) 中, \(y_1\) 最大的那个
合并左右儿子的 \((x_1,\ x_2)\) 时,即找 \(L\) 中最小值 \(mn\) 在 \(R\) 中的后缀 \(nxt\) ,组成 \((mn,\ nxt)\)
这时,我们不妨假设 \(k\) 中不存在长为 \(3\) 的上升子序列
可以发现这个限制是很强的。我们任选在 \(R\) 两个位置 \(t_1,\ t_2\) 满足 \(t_1<t_2,\ p_{t_1}>mn,\ p_{t_2}>mn\),必然存在 \(p_{t_1}>p_{t_2}\) ,否则 \((mn,\ p_{t_1},\ p_{t_2})\) 是一个长为 \(3\) 的上升子序列
因此,我们往 \(R\) 中递归,如果右儿子最大值大于 \(mn\) 则往右递归,否则往左
接着将 \(k\) 的贡献再考虑进去即可
时间复杂度 \(O(n\log^2n)\)
GYM102391J Parklife
给定 \(n\) 个互不相同的区间 \([l_i,\ r_i)\) ,满足任意两对区间要么不交要么相互包含,每个区间有价值 \(v_i\)
对于每个 \(k\in[1,\ n]\) ,求选出若干区间,使得每个点最多被覆盖 \(k\) 次,能够得到的最大价值
\(n\leq2.5\times10^5\)
可以看做一个树形 dp
记 \(dp_{i,\ j}\) 表示 \(i\) 子树内每个点最多被覆盖 \(j\) 次能够得到的最大价值
转移即为 \(dp_{i,\ j}=\max(\displaystyle\sum_{v\in son(i)}dp_{v,\ j},\ v_i+\displaystyle\sum_{v\in son(i)}dp_{v,\ j-1})\)
将 \(dp_i\) 看做以 \(j\) 为自变量的函数,可以发现它是凸函数
差分 \(dp_i\) 后,需要维护的操作为,维护 \(f_{i,\ j}=\displaystyle\sum_{v\in son(i)}dp_{v,\ j}\) ,向 \(f_i\) 中插入一个元素
可以用 set + 启发式合并 维护
时间复杂度 \(O(n\log^2n)\)
ps:好像这玩意儿可以证明是 \(O(n\log n)\) 的
「十二省联考 2019」春节十二响
考虑自底向上合并
已经知道了每个儿子点 \(v\) 的所分配的每个段的大小,合并两个儿子 \(v_1,\ v_2\) 时,容易发现按段大小降序合并,即将 \(v_1\) 的第 \(k\) 大段与 \(v_2\) 的第 \(k\) 大段合并,是最优的
因此用 set + 启发式合并 维护即可
GYM102059K Interesting Drug
\(N\) 个物品排成一排。从选择某个物品开始,每一步可以选择左 / 右最近的未被选择的物品,直到所有物品均被选择。若第 \(i\) 个物品恰好在第 \(C_i\) 步被选择,则会贡献 \(D_i\) 的价值。对每个 \(1\leq i\leq N\) ,求出第一步选择 \(i\) 能得到的最大价值。
\(N\leq2.5\times10^5\)
若某一步让物品 \(i\) 有了贡献,那么上一步所选的区间一定是 \([i-C_i+1,\ i-1]\) 或 \([i+1,\ i+C_i-1]\)
考虑将区间 \([l,\ r]\) 看做平面上的一个点,从起点 \([k,\ k]\) 开始,每次可以向左或向上走,终点为 \([1,\ N]\) ,物品 \(i\) 会给边 \([i-C_i+1,\ i-1]\to [i-C_i+1,\ i]\) 和 \([i+1,\ i+C_i-1]\to [i,\ i+C_i-1]\) 加上权值 \(D_i\) ,求走到终点的最大权值路径
可以发现我们可以将整个过程倒过来,从 \([1,\ N]\) 走到每个 \([k,\ k]\) , 可以排序后用树状数组维护 dp 序列
时间复杂度 \(O(n\log n)\)
GYM101741E Code-Cola Plants
给定一张 \(n\) 个点 \(m\) 条边的 DAG 和两个点 \(A,\ B\) (可以相等),保证 \(A\) 能到达所有点,每个点能到达 \(B\)
给 \(A,\ B\) 分别找一个大小为 \(n-1\) 的边集,满足两边集不交,且 \(A\) 仅经过边集 \(A\) 中的边能到达所有点,每个点能仅经过边集 \(B\) 中的点到达 \(B\)
\(n\leq5\times10^5;\ m\leq10^6\)
若给每个不是 \(A\) 的点 \(u\) 选择一条入边,那么这个边集一定是一个合法的 \(A\) 的边集
若给每个不是 \(B\) 的点 \(u\) 选择一条出边,那么这个边集一定是一个合法的 \(B\) 的边集
因此考虑将每个点拆成入点和出点,将这 \(2n\) 个点看做左部点,将 \(m\) 条边看做右部点,做二分图匹配即可
使用论文哥的板子即可跑过(
正解咕咕咕
TC11664 Rumor
有 \(n\) 个人,和一个 \(n\) 个点的有向图,有向边 \((u,\ v)\) 表示 \(u\) 可以向 \(v\) 传达信息
有上下两种信息,初始时有一些人恰好拥有这两种信息,其他人没有
每一天上午,每个人可以选一个自己拥有的上或下信息之一传递给所有他能传达的人;下午时,每个人会受到上午其他人传递过来的信息
问最优情况下,最少多少天所有人都能拥有上下两种信息
\(n\leq 20\)
做法一:
由于一个人最多只会传递上或下信息各一次, \(2^n\) 枚举每个人会先传递上信息还是下信息
暴力模拟,时间复杂度 \(O(2^nn^2)\)
可以压位,用位运算优化,时间复杂度 \(O(2^nn)\)
做法二:
咕咕咕
TC11379 YetAnotherORProblem
给定 \(n\) 个非负整数 \(R_i\) ,问有多少个长为 \(n\) 的非负整数序列 \(a_i\) 满足:
- \(a_i\leq R_i\)
- \(a_1+a_2+\cdots +a_n=a_1|a_2|\cdots|a_n\)
\(n\leq10;\ R_i\leq10^{18}\)
容易发现满足限制 \(2\) 当且仅当每个 bit 最多只在一个 \(a_i\) 中出现过
考虑数位 dp,记 \(dp_{i,\ S}\) 表示考虑了二进制下前 \(i\) 高位,集合 \(S\) 中的元素 \(x\) 满足前 \(i-1\) 位填的数恰好与 \(x\) 前 \(i-1\) 位相同
转移即枚举二进制下每一位 \(i\) ,是否将 \(2^i\) 加给 \(a_1,\ a_2,\ \cdots,\ a_n\) 中的某一个数,如果要加,加给谁
时间复杂度 \(O(2^n\log R_i)\)
CF1420C2 Pokémon Army (hard version)
给定一个 \(n\) 个排列 \(a_i\) ,定义一个排列的权值为,对于 \(a_i\) 的 \(2^n-1\) 个子序列 \(b_1<b_2<\cdots<b_k\) ( \(b_i\) 为下标 ) ,式子 \(\displaystyle\sum_{i=1}^k(-1)^{k-1}a_{b_i}\) 的最大值
有 \(q\) 次修改操作,每次交换排列中的两个数,求出每次交换后的答案
\(n, q\leq3\times10^5\)
显然可以用线段树维护矩阵,然而有高妙的线性做法
不妨假设 \(a_0=a_{n+1}=0\)
我们定义位置 \(i\) 是局部最大值,当且仅当 \(a_{i-1}<a_i\) 且 \(a_i>a_{i+1}\) ;定义位置 \(i\) 是局部最小值,当且仅当 \(a_{i-1}>a_i\) 且 \(a_i<a_{i+1}\)
结论:答案为序列的局部最大值与局部最小值之和,而最优子序列一定满足,若 \(i\) 是奇数, \(b_i\) 是局部最大值,若 \(i\) 是偶数, \(b_i\) 是局部最小值
首先最优的子序列 \(b_1,\ b_2,\ \cdots,\ b_k\) 一定满足 \(k\) 是奇数,否则删去 \(b\) 中最后一个元素更优
若奇数 \(i\) 满足 \(b_i\) 不是局部最大值,可以将 \(b_i\) 换成上 / 下一个局部最大值使得答案更优;偶数同理
只保留局部最值的位置,容易发现局部最大值与最小值交替出现,且第一个与最后一个一定是局部最大值
每次询问时只用修改交换的两个位置及其左右共六个位置的贡献
一道被读错了题意的cf题
给定平面上 \(n\) 个不同点 \((x_i,\ y_i)\) ,你可以在任意一个位置加入一个点,使得这 \(n+1\) 个点属于同一个连通块
定义两个点是连通的当且仅当它们之间的曼哈顿距离不大于 \(T\) ,求最小的 \(T\)
- \(n\leq10^5\)
- \(x_i,\ y_i\leq10^9\)
先二分 \(T\) ,转到切比雪夫坐标系上,将每个点 \((x,\ y)\) 对应到与它连通的那个矩形上
可以用扫描线+线段树扫出每个点所属的连通块
易证若当前二分的 \(T\) 合法,那么没加第 \(n+1\) 个点前平面上最多只有 \(4\) 个连通块
对每个连通块,定义其中的新点为所有其中矩形的四个顶点
枚举一个连通块的新点,枚举它们作为第 \(n+1\) 个点的四个顶点之一时,能否覆盖到其他三个连通块的新点,即转化成了一个二维偏序问题
时间复杂度 \(O(n\log n)\)
发现我不会 dfs /kk
orzjk