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

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

A. Aloha

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

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

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

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

B. Origami

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

C. Continued Story

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

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

D. The Easiest One

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

  • 若对于任意 ii 都有 xiyix_i \geq y_i,则最小步数是 xiyi\sum{x_i} - \sum{y_i}
  • 若存在最大的 uu 使得 xu<yux_u < y_u,那么存在最小的 vv 使得 u<vu < vxv>yvx_v > y_v,在这种情况下,最优的方法是将 xx 的高于第 vv 位的位置与 yy 对齐,将低于 vv 位的位置消为 00,将第 vv 位变为 (yv+1)(y_v + 1),然后使用第一种操作,再将低于 vv 位的位置补齐,最小步数是 xiyi+v(B1)\sum{x_i} - \sum{y_i} + v (B - 1),其中 B=2B = 2

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

E. Set

设全集为 UU,若 U=k|U| = k 可行,则 U=k+1|U| = k + 1 也可行。二分 kk,检查 U=k|U| = k 是否可行即可确定 minU\min{|U|}。对于可行的状态,可以归纳证明只考虑 l1,l2,,lil_1, l_2, \cdots, l_i 不考虑 l0l_0S0Si|S_0 \cup S_i| 的取值是一个区间,记录上下界即可确定是否存在可行的状态。

令只考虑 l1,l2,,lil_1, l_2, \cdots, l_i 不考虑 l0l_0S0Si|S_0 \cup S_i| 的上下界分别为 f(i)f(i)g(i)g(i),根据 f(i1)f(i - 1)g(i1)g(i - 1) 可以确定它们的值。

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

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

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

F. Old Problem

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

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

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

若令 g(w)=14a,bZ[a2+b2=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]} (w1)(w \geq 1),则 f(w)=d2wg(wd2)f(w) = \sum_{d^2 | w}{g\left(\frac{w}{d^2}\right)},那么有:

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

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

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

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

G. Periodic Palindrome

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

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

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

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

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

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

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

H. Accel World

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

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

I. Hello, Hello and Hello

不妨设字符串长度为 nn,出现最多的字符 cc 出现了 mm 次。

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

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

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

J. Sortable Path on Tree

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

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

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值