2018 Multi-University Training Contest 3 solutions BY Claris(转载)

A. Ascending Rating 按照 r m n 的顺序很难解决这个问题。 考虑按照 r n m 的顺序倒着求出每个区间的答案。按照滑窗最大值的经典方法维护 a 的单调队列,那么队列中的元素个数就是最大值的变化次数。 时间复杂度 O ( n )

B. Cut The String 一个字符串的所有回文后缀一定是它的最长回文后缀的所有border。一个字符串的所有border按照长度排序后可以用 O ( log n ) 个等差数列表示。利用回文树可以直接得到每个前缀的最长回文后缀,稍加修改即可得到 O ( log n ) 个等差数列表示的所有回文后缀。 用两棵回文树预处理出每个前缀的回文后缀集合 f i 以及每个后缀的回文前缀集合 g i 。 对于一个询问 l , r ,枚举 g l 以及 f r 的两个等差数列,扩展欧几里得求出方案数,时间复杂度 O ( m log 3 n ) ,不能接受。 在扩展欧几里得之前根据上下界粗判即可去掉一个 O ( log n ) ,因为只有 O ( log n ) 对等差数列的上下界相交。 时间复杂度 O ( m log 2 n )

C. Dynamic Graph Matching 设 f [ i ] [ S ] 表示前 i 次操作之后, S 集合的点已经匹配的方案数。 对于加边操作,显然 f [ i ] [ S ] = f [ i 1 ] [ S ] + f [ i 1 ] [ S u v ] i 这一维可以省略,从大到小遍历 S f [ S ] + = f [ S u v ] 。 对于删边操作,注意到加边操作的顺序不影响结果,可以假设第 i 1 次操作是加入要删除的边。将加边操作的更新倒过来,得到:从小到大遍历 S f [ S ] = f [ S u v ] 。 时间复杂度 O ( m 2 n )

D. Euler Function 显然 φ ( 1 ) = 1 不是合数,只考虑 n 2 的情况。 设 n = p 1 k 1 p 2 k 2 . . . p m k m ,则 φ ( n ) = p 1 k 1 1 ( p 1 1 ) p 2 k 2 1 ( p 2 1 ) . . . p m k m 1 ( p m 1 ) 。 * 若 2 的指数不超过 1 ,那么 2 不影响 φ ( n ) 的素性。 * 若 2 的指数为 2 ,那么对 φ ( n ) 贡献一个 2 。 * 若 2 的指数 3 ,那么对 φ ( n ) 至少贡献一个 4 ,此时 φ ( n ) 一定是合数。 对于除 2 之外的质数 p ,如果指数 2 ,那么至少贡献了 ( p 1 ) p 。如果除 2 之外还有至少两个质数 p , q ,那么至少贡献了 ( p 1 ) ( q 1 ) 。所以这两种情况下 φ ( n ) 一定是合数。 剩下的情况只能是以下几种之一,其中 p 是大于 2 的质数: * n = 2 , 4 ,显然是素数。 * n = p ,当 p > 3 时一定是偶合数,而当 p = 3 , n = 3 时是偶素数。 * n = 2 p ,同理当 p > 3 时一定是偶合数,而当 p = 3 , n = 6 时是偶素数。 * n = 4 p ,那么 φ ( n ) 中至少有两个 2 ,所以一定是合数。 综上所述,当且仅当 n = 1 , 2 , 3 , 4 , 6 时, φ ( n ) 不是合数。 a n s ( k ) = k + 4 + [ k > 1 ] 。 时间复杂度 O ( 1 )

E. Find The Submatrix 对于每一行来说,最优方案一定是将最小的若干个数修改为 0 ,设 a [ i ] [ j ] 表示第 i 行修改前 j 小的数的和,则 a [ i ] [ j ] a [ i ] [ j + 1 ] a [ i ] [ j + 1 ] a [ i ] [ j + 2 ] 。 设 f [ i ] [ j ] [ 0 ] [ k ] 表示考虑前 i 行,选了完整的 j 个连续子矩阵,修改了 k 次,且选择第 i 行时的最大和。 设 f [ i ] [ j ] [ 1 ] [ k ] 表示考虑前 i 行,选了完整的 j 个连续子矩阵,修改了 k 次,且不选择第 i 行时的最大和。 初始状态: f [ 0 ] [ 0 ] [ 1 ] [ 0 ] = 0 。 对于某个 f [ i ] [ j ] [ 0 ] [ k ] ,要么和上一行连起来,要么上一行不选并新开一个连续子矩阵,故 f [ i ] [ j ] [ 0 ] [ k ] = max ( f [ i 1 ] [ j ] [ 0 ] [ x ] + a [ i ] [ k x ] , f [ i 1 ] [ j 1 ] [ 1 ] [ x ] + a [ i ] [ k x ] ) 。 对于某个 f [ i ] [ j ] [ 1 ] [ k ] ,上一行要么选要么不选,故 f [ i ] [ j ] [ 1 ] [ k ] = max ( f [ i 1 ] [ j ] [ 0 ] [ k ] , f [ i 1 ] [ j ] [ 1 ] [ k ] ) 。 直接转移时间复杂度为 O ( n m A B ) ,不能接受。将 f [ i ] [ j ] [ 0 ] [ k ] 两部分转移分别求出最优值然后取 max 。需要优化的部分形如 g [ k ] = max ( f [ x ] + w [ k x ] ) ,其中 w [ j ] w [ j + 1 ] w [ j + 1 ] w [ j + 2 ] 。 考虑对于固定的 k ,有两个决策 i , j 作为 x ,其中 i < j i j 劣,则 f [ i ] + w [ k i ] f [ j ] + w [ k j ] 。若 k 增加 1 ,因为 k i > k j ,所以 w [ k i ] 的增量小于 w [ k j ] 的增量, i 将永远比 j 劣。所以最优决策 x 具有决策单调性,分治求解即可。 时间复杂度 O ( n m log m + n A B log A )

F. Grab The Tree 设 s u m 为所有点权的异或和, A 为先手得分, B 为后手得分。 * 若 s u m = 0 ,则 A = B ,故无论如何都是平局。 * 否则考虑 s u m 二进制下最高的 1 所在那位,一定有奇数个点那一位为 1 。若先手拿走任意一个那一位为 1 的点,则 B 该位为 0 ,故先手必胜。 时间复杂度 O ( n )

G. Interstellar Travel 显然坐标相同的点里只保留编号最小的点最优。 将起点到终点的路径补全为终点往下走到无穷远处,再往左走到起点正下方,再往上回到起点。任意路径中回到起点部分的代价相同,观察代价和的几何意义,就是走过部分的面积的相反数。代价和最小等价于面积最大,故一定是沿着上凸壳行走。 显然起点、终点、凸壳的拐点必须要作为降落点。对于共线的点 a 1 , a 2 , . . . , a m ,若一个点 i 的编号是 [ i , m ] 中最小的,那么在此处降落可以最小化字典序。 时间复杂度 O ( n log n )

H. Monster Hunter 以 1 为根将树转化成有根树,那么每只怪兽要在父亲怪兽被击败后才能被击败。考虑简化版问题:忽略父亲的限制,求最优的攻击顺序。 将怪兽分成两类: a < b 的和 a b 的,前一类打完会加血,后一类打完会扣血,显然最优策略下应该先打第一类再打第二类。 * 对于 a < b 的怪兽,显然最优策略下应该按照 a 从小到大打。 * 对于 a b 的怪兽,考虑两只怪兽 i , j ,先打 i 再打 j 的过程中血量会减少到 H P + min ( a i , a i + b i a j ) ,因为 a b ,所以这等于 H P a i a j + b i 。同理先打 j 再打 i 的过程中血量会减少到 H P a i a j + b j 。可以发现按照任何顺序都只和 b 有关,最优策略下需要让血量尽可能多,因此要按照 b 从大到小打。 如此可以 O ( 1 ) 比较任意两只怪兽应该先打谁,从而得到最优攻击顺序。 考虑原问题,求出忽略父亲限制后最优攻击顺序 p 1 , p 2 , . . . , p n 。 * 若 p 1 = 1 ,那么第一步打 p 1 一定最优。 * 若 p 1 1 ,那么在打完 p 1 的父亲 x 后,紧接着打 p 1 一定最优。直接将 p 1 x 两只怪兽合并,依然用 ( a , b ) 表示,并将 p 1 所有儿子的父亲改为 x 即可消除 p 1 的影响。 上面两步将规模为 n 的问题化成了规模为 n 1 的问题,重复操作直到只剩下一只怪兽即可求出最少所需血量。 需要高效支持修改一个怪兽,删除最优怪兽,以及修改父亲的操作。对于最优怪兽,可以用堆维护。对于修改父亲,可以用并查集维护。 时间复杂度 O ( n log n )

I. Random Sequence 设 f [ i ] [ x ] [ y ] [ z ] 表示考虑前 i 个位置, a i = x , gcd ( a i , a i 1 ) = y , gcd ( a i , a i 1 , a i 2 ) = z 的期望,枚举 a i + 1 的值转移即可。 时间复杂度 O ( n m S ) ,其中 S 表示 ( x , y , z ) 的状态数。显然合法状态中 y | x , z | y ,当 m = 100 S = 1471

J. Rectangle Radar Scanner 因为信息不可减,所以不能通过二维数点的方法差分得到答案。 将平面上的点按横坐标进行分治,在两侧递归处理所有没有覆盖中线的矩形询问。对于覆盖当前中线的询问,拆成中线左右两个询问,那么两侧的信息没有重叠,而且矩形 4 个边界中有一个边界的限制消失了。 问题转化为:求 x A , B y C 的所有点的信息和。按横坐标将询问和点排序,依次加入每个点或者回答每个询问。用线段树维护纵维度每个区间的信息和。 时间复杂度 O ( ( n log n + m ) log n )

K. Transport Construction 考虑Boruvka算法求最小生成树的过程。对于每个点寻找与它相连的边权最小的边,若边权相同则取另一个端点编号最小的。那么每个连通块要么是树,要么是二元环,最多 n 2 个连通块。将每个连通块缩点,反复迭代 O ( log n ) 轮,直至剩下一个点。 问题转化为,给定 n 个带颜色的点,对于每个点询问和它异色的点中和它点积最小的点。 对颜色进行分治,假设当前考虑 [ l , r ] 的所有颜色,递归分治 [ l , m i d ] [ m i d + 1 , r ] ,然后用 [ l , m i d ] 询问 [ m i d + 1 , r ] ,再用 [ m i d + 1 , r ] 询问 [ l , m i d ] 。 考虑点积的几何意义:向量投影的长度。将一条直线从原点开始往上移动,直到碰到一个点,此时碰到的点一定点积最小。只有下凸壳上的点会被直线碰到,将子区间的凸壳按照横坐标归并,同时将子区间的询问直线按照斜率归并,然后双指针即可。 每轮分治时间复杂度 O ( n log n ) ,总时间复杂度 O ( n log 2 n )

L. Visual Cube 计算画布大小以及各个关键位置的坐标。按照格式将画布填充正确。

M. Walking Plan 设 G [ i ] [ j ] 表示 i 一步到 j 的最短路, f [ t ] [ i ] [ j ] 表示 i 经过恰好 t 条边到达 j 的最短路,则 f [ t ] [ i ] [ j ] = min ( f [ t 1 ] [ i ] [ k ] + G [ k ] [ j ] ) f 具有更强的性质,即 f [ t ] [ i ] [ j ] = min ( f [ x ] [ i ] [ k ] + f [ t x ] [ k ] [ j ] ) 。将合并的过程看作乘法,则 f [ t ] = f [ x ] f [ t x ] = G t 。 注意到 k 10000 ,设 A = k 100 , B = k mod 100 ,将每个询问 s , t , k 拆成两步: 1. 从 s 出发经过恰好 100 A 条边到达某个点 u 。 2. 从 u 出发经过至少 B 条边到达 t 。 设 a [ i ] = G 100 i , b [ i ] = G i ,那么 a [ i ] 即为经过恰好 100 i 条边的最短路,对于 b [ i ] 需要再进行一次Floyd得到至少 i 条边的最短路。 枚举中间点 u ,则 a n s = min ( a [ A ] [ s ] [ u ] + b [ B ] [ u ] [ t ] ) 。 时间复杂度 O ( n 3 k + q n )

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/81348320