2018字节跳动冬令营网络赛题解(10/10)

题目和代码请参考题目链接和代码链接,本文只记录解题思路。

A. Aloha

首先需要解决的问题是,如何根据 v 2 + 2 g y = 0 v^2 + 2 g y = 0 v2+2gy=0,得到从 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 沿直线走到 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 的时间。

  • y 1 y_1 y1 y 2 y_2 y2 不全为负数,则 y 1 > 0 y_1 > 0 y1>0 y 2 > 0 y_2 > 0 y2>0 y 1 = y 2 = 0 y_1 = y_2 = 0 y1=y2=0 时无法走动,否则可以视为从 x x x 轴上某点走到 x x x 轴下方某点的匀加速直线运动。
  • 否则,若 y 1 = y 2 y_1 = y_2 y1=y2,可以视为匀速直线运动。
  • 否则,取路径所在直线与 x x x 轴的交点,可以变为第一种情况。
  • 以上有解情况均可视为匀加速直线运动,可以用平均速度解出时间。

接下来需要考虑管道的有序组合。

  • 只用一根管道:管道长度只需要等于起点到终点距离。
  • 用两根管道:若起点与终点重合,则直下直上最优;否则路径与起点到终点的连线形成(可能退化的)三角形,解出拐点位置转化为只用一根管道的问题。
  • 用三根管道:若起点与终点重合,则需要画出以定点为顶点的三角形,否则需要画出以定线段为边的四边形(多边形均可能退化)。第一个拐点的可行位置在至多两段圆弧上,不妨考虑耗时与第一个拐点位置之间的函数。若起点与终点重合,则函数对称,且函数的每一半都是下凸的;否则函数最多为两个分段下凸函数。三分找到可行最优解即可。

B. Origami

在原排列相邻两点之间连一条线,结果折叠后,这些线会位于纸片堆的两侧,每一侧的线要么包含要么不相交。排序检查即可。

C. Continued Story

考虑将题目转化为有根无向图删边游戏 (Hackenbush),每条树边的边权代表了无向图上两端点之间的边数量。注意到对于边权大于 1 1 1 时会形成环,按奇偶性缩环即可。

在计算出 SG 值后,每一步操作会改动一条到根路径上的所有 SG 值,自根向下确定每个子树如果修改那么需要修改得到的 SG 值是多少,即可检查某一种操作是否能使得先手必胜。

D. The Easiest One

考虑 x x x y y y 的二进制表示 ( x k x k − 1 ⋯ x 0 ) (x_k x_{k - 1} \cdots x_0) (xkxk1x0), ( y k y k − 1 ⋯ y 0 ) (y_k y_{k - 1} \cdots y_0) (ykyk1y0),不难分析得到最小步数。

  • 若对于任意 i i i 都有 x i ≥ y i x_i \geq y_i xiyi,则最小步数是 ∑ x i − ∑ y i \sum{x_i} - \sum{y_i} xiyi
  • 若存在最大的 u u u 使得 x u < y u x_u < y_u xu<yu,那么存在最小的 v v v 使得 u < v u < v u<v x v > y v x_v > y_v xv>yv,在这种情况下,最优的方法是将 x x x 的高于第 v v v 位的位置与 y y y 对齐,将低于 v v v 位的位置消为 0 0 0,将第 v v v 位变为 ( y v + 1 ) (y_v + 1) (yv+1),然后使用第一种操作,再将低于 v v v 位的位置补齐,最小步数是 ∑ x i − ∑ y i + v ( B − 1 ) \sum{x_i} - \sum{y_i} + v (B - 1) xiyi+v(B1),其中 B = 2 B = 2 B=2

d p ( l e n , p , q ) dp(len, p, q) dp(len,p,q) 表示不考虑低 l e n len len 位时 x x x 是否已经小于 n n n 的状态为 p p p(若是,则 p = 1 p = 1 p=1,否则 p = 0 p = 0 p=0), x x x y y y 的状态为 q q q(若 q = 0 q = 0 q=0,则高位未出现 u u u;若 q = 1 q = 1 q=1 则高位出现 u u u 但未出现 v v v;若 q = 2 q = 2 q=2,则高位已出现 u u u v v v)的情况下低 l e n len len 位的 ( x , y ) (x, y) (x,y) 数量和它们对步数的贡献,枚举第 l e n len len 位转移即可,时间复杂度 O ( l e n ) O(len) O(len)

E. Set

设全集为 U U U,若 ∣ U ∣ = k |U| = k U=k 可行,则 ∣ U ∣ = k + 1 |U| = k + 1 U=k+1 也可行。二分 k k k,检查 ∣ U ∣ = k |U| = k U=k 是否可行即可确定 min ⁡ ∣ U ∣ \min{|U|} minU。对于可行的状态,可以归纳证明只考虑 l 1 , l 2 , ⋯   , l i l_1, l_2, \cdots, l_i l1,l2,,li 不考虑 l 0 l_0 l0 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| S0Si 的取值是一个区间,记录上下界即可确定是否存在可行的状态。

令只考虑 l 1 , l 2 , ⋯   , l i l_1, l_2, \cdots, l_i l1,l2,,li 不考虑 l 0 l_0 l0 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| S0Si 的上下界分别为 f ( i ) f(i) f(i) g ( i ) g(i) g(i),根据 f ( i − 1 ) f(i - 1) f(i1) g ( i − 1 ) g(i - 1) g(i1) 可以确定它们的值。

不妨设 ∣ S 0 ∪ S i − 1 ∣ = x |S_0 \cup S_{i - 1}| = x S0Si1=x,那么可以按如下方式从空集开始构造 S i S_i Si

  • 最大化 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| S0Si:尽量选择 S 0 ∪ ( U − S i − 1 ) S_0 \cup (U - S_{i - 1}) S0(USi1) 的元素加入 S i S_i Si,然后用 ( U − S 0 ) ∪ ( U − S i − 1 ) (U - S_0) \cup (U - S_{i - 1}) (US0)(USi1) 的元素补满 ∣ S i \ S i − 1 ∣ |S_i \backslash S_{i - 1}| Si\Si1,再尽量用 S 0 ∪ S i − 1 S_0 \cup S_{i - 1} S0Si1 的元素补充 S i S_i Si
  • 最小化 ∣ S 0 ∪ S i ∣ |S_0 \cup S_i| S0Si:尽量选择 ( U − S 0 ) ∪ ( U − S i − 1 ) (U - S_0) \cup (U - S_{i - 1}) (US0)(USi1) 的元素加入 S i S_i Si,然后用 S 0 ∪ ( U − S i − 1 ) S_0 \cup (U - S_{i - 1}) S0(USi1) 的元素补满 ∣ S i \ S i − 1 ∣ |S_i \backslash S_{i - 1}| Si\Si1,再尽量用 ( U − S 0 ) ∪ S i − 1 (U - S_0) \cup S_{i - 1} (US0)Si1 的元素补充 S i S_i Si

经过分析不难省去枚举 f ( i − 1 ) ≤ x ≤ g ( i − 1 ) f(i - 1) \leq x \leq g(i - 1) f(i1)xg(i1) 的过程,最后检查 ∣ U − S n − 1 ∣ |U - S_{n - 1}| USn1 能否不小于 l 0 l_0 l0 即可。

F. Old Problem

不妨设两个直角边对应的向量是 ( u a , u b ) (u a, u b) (ua,ub) ( − v b , v a ) (-v b, v a) (vb,va),这里 u , v , a , b u, v, a, b u,v,a,b 都是整数,且 gcd ⁡ ( ∣ a ∣ , ∣ b ∣ ) = 1 \gcd(|a|, |b|) = 1 gcd(a,b)=1。若能枚举这两个向量,则可以简单计算得出对应的顶点方案数。令 a 2 + b 2 = w a^2 + b^2 = w a2+b2=w,则 s = u v w s = u v w s=uvw,可以考虑枚举出互质的 a , b a, b a,b,然后再枚举相应的 u , v u, v u,v

不妨令 f ( w ) = 1 4 ∑ a , b ∈ Z [ a 2 + b 2 = w ] f(w) = \frac{1}{4}\sum_{a, b \in \mathbb{Z}}{[a^2 + b^2 = w]} f(w)=41a,bZ[a2+b2=w] ( w ≥ 1 ) (w \geq 1) (w1),则根据高斯整环上的结论可知 f ( w ) f(w) f(w) 是关于 w w w 的积性函数。具体来说,若 w = ∏ i = 1 k p i e i w = \prod_{i = 1}^{k}{p_i^{e_i}} w=i=1kpiei,其中 p i p_i pi 是互不相同的质因子,则 f ( w ) = ∏ i = 1 k f ( p i e i ) f(w) = \prod_{i = 1}^{k}{f(p_i^{e_i})} f(w)=i=1kf(piei),其中:

  • p = 2 p = 2 p=2,则 f ( p e ) = 1 f(p^e) = 1 f(pe)=1 ( e = 0 , 1 , ⋯   ) (e = 0, 1, \cdots) (e=0,1,)
  • p ≡ 1 ( m o d 4 ) p \equiv 1 \pmod{4} p1(mod4),则 f ( p e ) = e + 1 f(p^e) = e + 1 f(pe)=e+1 ( e = 0 , 1 , ⋯   ) (e = 0, 1, \cdots) (e=0,1,)
  • p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p3(mod4),则 f ( p 2 e ) = 1 f(p^{2 e}) = 1 f(p2e)=1, f ( p 2 e + 1 ) = 0 f(p^{2 e + 1}) = 0 f(p2e+1)=0 ( e = 0 , 1 , ⋯   ) (e = 0, 1, \cdots) (e=0,1,)

若令 g ( w ) = 1 4 ∑ a , b ∈ Z [ a 2 + b 2 = w ] [ gcd ⁡ ( ∣ a ∣ , ∣ b ∣ ) = 1 ] g(w) = \frac{1}{4}\sum_{a, b \in \mathbb{Z}}{[a^2 + b^2 = w] [\gcd(|a|, |b|) = 1]} g(w)=41a,bZ[a2+b2=w][gcd(a,b)=1] ( w ≥ 1 ) (w \geq 1) (w1),则 f ( w ) = ∑ d 2 ∣ w g ( w d 2 ) f(w) = \sum_{d^2 | w}{g\left(\frac{w}{d^2}\right)} f(w)=d2wg(d2w),那么有:

  • p = 2 p = 2 p=2,则 g ( p ) = 1 g(p) = 1 g(p)=1, g ( p e ) = 0 g(p^e) = 0 g(pe)=0 ( e = 1 , 2 , ⋯   ) (e = 1, 2, \cdots) (e=1,2,)
  • p ≡ 1 ( m o d 4 ) p \equiv 1 \pmod{4} p1(mod4),则 g ( p e ) = 2 g(p^e) = 2 g(pe)=2 ( e = 1 , 2 , ⋯   ) (e = 1, 2, \cdots) (e=1,2,)
  • p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p3(mod4),则 g ( p e ) = 0 g(p^e) = 0 g(pe)=0 ( e = 1 , 2 , ⋯   ) (e = 1, 2, \cdots) (e=1,2,)

于是 w w w 便有了许多限制,在题目限制内最坏的情况下, ( u , v , a , b ) (u, v, a, b) (u,v,a,b) 的数量最多为 96768,此时 s = 80753400 s = 80753400 s=80753400

对于枚举 ( a , b ) (a, b) (a,b)。根据高斯整环能够唯一分解的结论,已知满足条件的 a 2 + b 2 = x a^2 + b^2 = x a2+b2=x, c 2 + d 2 = y c^2 + d^2 = y c2+d2=y,便可以得到满足条件的 ( a c + b d ) 2 + ( a d − b c ) 2 = x y (a c + b d)^2 + (a d - b c)^2 = x y (ac+bd)2+(adbc)2=xy,那么只需要对于每个质数 p p p 构造出满足 a 2 + b 2 = p a^2 + b^2 = p a2+b2=p, gcd ⁡ ( ∣ a ∣ , ∣ b ∣ ) = 1 \gcd(|a|, |b|) = 1 gcd(a,b)=1 的解即可。对于有解的 p p p,不妨令 z 2 ≡ − 1 ( m o d p ) z^2 \equiv -1 \pmod{p} z21(modp),在对 z p \frac{z}{p} pz 进行连分数展开时即可找到相应的 a a a。具体来说,可以在 O ( log ⁡ p ) O(\log p) O(logp) 求解出二次剩余 z z z 后,用辗转相除法求 gcd ⁡ ( z , p ) \gcd(z, p) gcd(z,p),在这个过程中得到的第一个不超过 p \sqrt{p} p 的余数 r r r 可以构造一组解 a = r a = r a=r, b = p − r 2 b = \sqrt{p - r^2} b=pr2

注意到 ∣ a ∣ < 0 |a| < 0 a<0 ∣ b ∣ < 0 |b| < 0 b<0 ∣ a ∣ > ∣ b ∣ |a| > |b| a>b 的情况可以规约到 0 ≤ a ≤ b 0 \leq a \leq b 0ab 的情况,而 a = b a = b a=b 的情况只有 ∣ a ∣ = ∣ b ∣ = 1 |a| = |b| = 1 a=b=1,具体实现时不妨只考虑 0 ≤ a ≤ b 0 \leq a \leq b 0ab 的情况,可以减少常数。不过这道题似乎没有极限数据。

G. Periodic Palindrome

不妨考虑连续的 w w w w r w^r wr 出现的次数。

若出现次数为 1 1 1,即 w w w 两侧均无法形成 w r w^r wr,则只需要 w w w 是两个对称轴之间的子串,且这两个对称轴两边的长度都小于 ∣ w ∣ |w| w

若出现次数至少为 2 2 2,即 w w w 至少一侧存在相邻的 w r w^r wr,则整个串必然以 2 ∣ w ∣ 2 |w| 2w 为周期,而 w w w 必然是一个偶回文串的左半边或右半边。

对于第一种情况,用 manacher 算出这样的对称轴,扫一遍即可。

对于第二种情况,不妨在 w w w 的右端点处统计贡献。如果 w w w 可以是一个偶回文串的左半边,那么它的长度不能超过以它右端点为对称轴的极长回文子串长度,否则它的长度必须是以这个右端点结尾的偶回文串长度的一半。前者需要枚举整个串的周期来检查,后者需要枚举整个串的周期和前缀串的回文后缀长度的公共部分。

注意到一个串的回文后缀都是这个串的最长回文后缀的 border,而一个串的 border 长度或周期长度均可以表示为 O ( log ⁡ n ) O(\log n) O(logn) 个不相交的等差数列,而这样的两组等差数列求交集可以用 O ( log ⁡ n ) O(\log n) O(logn) 次统计整系数方程 a x + b y = c a x + b y = c ax+by=c 满足 x l ≤ x ≤ x r x_l \leq x \leq x_r xlxxr, y l ≤ y ≤ y r y_l \leq y \leq y_r ylyyr 的整数解 ( x , y ) (x, y) (x,y) 数量的询问实现。

对于每个询问,可以 O ( log ⁡ n ) O(\log n) O(logn) 得到一组特解 a x 0 + b y 0 = c a x_0 + b y_0 = c ax0+by0=c,而其他解满足 x t = x 0 + b gcd ⁡ ( a , b ) t x_t = x_0 + \frac{b}{\gcd(a, b)} t xt=x0+gcd(a,b)bt, y t = y 0 + a gcd ⁡ ( a , b ) t y_t = y_0 + \frac{a}{\gcd(a, b)} t yt=y0+gcd(a,b)at ( t ∈ Z ) (t \in \mathbb{Z}) (tZ),随便统计一下即可。这道题也似乎没有极限数据。

H. Accel World

不难发现,如果走过的路径含有环,那么可以在这个环上走无穷次,使得之后的耗时趋近零,否则走过的路径点数不会超过 n n n。仔细思考一下可以发现,如果要走环,那么在两个加速点之间来回走不会使得解更差。

f ( i , j ) f(i, j) f(i,j) 表示从起点走到第 i i i 个加速点 j j j 的耗时乘以 2 i − 1 2^{i - 1} 2i1 的最小值,枚举下一步走到哪,是否再走回来打转即可。由于 f ( i , j ) f(i, j) f(i,j) 可能达到 2 n − 1 ( n − 1 ) max ⁡ w 2^{n - 1} (n - 1) \max{w} 2n1(n1)maxw,所以需要用 128 位整数计算。

I. Hello, Hello and Hello

不妨设字符串长度为 n n n,出现最多的字符 c c c 出现了 m m m 次。

m > n − m + 1 m > n - m + 1 m>nm+1,则无法构造合法解。

m = n − m + 1 m = n - m + 1 m=nm+1,则构造的合法解一定是 c c c 和其他字符交替出现,其他字符完全可以视为同种字符,每次选择有必要移动的相邻两个不同字符移到末尾即可。当初始串中存在 c c c 要移动,且 c c c 右侧有字符时,最后一步会需要移动唯一一个 c c c

否则可以考虑维护还需要修改的字符串区间,每次可以从中将相邻的 01 01 01 12 12 12 放到末尾(将其视为删除),也可以将除了头尾的 02 02 02 之外的字符串区间移到末尾(将 02 02 02 视为删除)。这意味着可以任选两种字符将其相邻同种字符的数量减一,每次选择最大的两种字符删减即可做到最优。注意构造方案时可以尽量不动 12 12 12,需要动的 12 12 12 可以在 01 01 01 之前移动。

J. Sortable Path on Tree

对于一条路径,不妨将其定向,然后考虑用路径上相邻两个点权值的大小关系组成的序列,在这个序列末尾增加两端点权值的大小关系使其构成有向环。如果这样的有向环上小于号或大于号的出现次数不超过 1 1 1,则这条路径的是满足条件的。

不妨利用点分治在 u , v u, v u,v 的最近公共祖先 p p p 处统计满足条件的路径。维护 p p p u u u v v v 的路径上大于号与小于号出现的次数,次数不小于 2 2 2 时可以视为次数等于 2 2 2。然后将点按照权值排序,考虑两端点的权值是否相等,对每个 u u u 统计在它之前满足条件的 v v v 即可。

你可能感兴趣的:(线上比赛,Nowcoder)