AtCoder Beginner Contest 243 题解

A,B题过水已隐藏

C题 Collision 2

给定 \(n\) 个动点,每个点有向左或向右运动方向和初始坐标 \((x_i,y_i)\) ,问是否存在相撞的点?

\(n\le2e5,0 \le x_i,y_i\le1e9\)

此题的启示:无。

注意到一个显然的性质,点只会左右运动,也即只有相同纵坐标的点可能相撞,于是按 \(y\) 为第一关键字,\(x\) 为第二关键字排序,如果当前的点是向左,那么记录一下,如果后面出现了向右的点匹配就有解,一直找不到则无解。

D题 Moves on Binary Tree

一棵无限大的二叉树,根节点是 \(1\) ,点 \(i\) 的左儿子和右儿子是 \(2i\)\(2i+1\) ,开始在节点 \(X\) ,给定一个长为 \(n\) 操作字符串,有回到父亲,去左儿子,去右儿子三种操作,求最后所在节点编号。

\(1\le n\le 1e6\) ,保证最后的答案在 \(1e18\) 之内。

此题的启示:大数运算(非高精度)考虑二进制下的意义

开始看错范围 \(TLE\) 了一发,暴力做的话,答案显然是指数级增长的,考虑当前所在节点编号在二进制下的状态,如果向左走就是末尾加上一个 \(0\) ,向右就是末尾加上一个 \(1\) ,向上就是最高位减少一位,最后得到一个二进制串,把二进制转成十进制,于是线性复杂度解决问题。

E题 Edge Deletion

给定一个 \(n\) 个点,\(m\) 条边的简单无向图,在不影响任意两个点的最短路长度的情况下删去最多的边,求这个边数

\(2\le n\le 300\)

此题的启示:看到不影响最短路的限制,先考虑最短路本身的性质,而不是最短路径树。

我开始的想法是建出最短路径树,不过并不是很可做?

对每条边分别考虑,假设当前边连接 \((s,t)\) ,长度是 \(w\) ,如果存在另一条不同的 \(s\)\(t\) 的路径,且该路径长度 \(\le w\),那么这条边删去,对当前的最短路长度无影响,对于其他点,由于这条边并不是 \((s,t)\) 间的最短路,所以其他需要经过 \(s\)\(t\) 的最短路也不会经过这条边,所以对任意两点的最短路长度均无影响,可以删去,于是只需要 \(floyd\) 求出全源最短路,然后对于每条边,枚举除了边的端点以外的其他点,看是否存在这样一条其他路径即可。

G题 Sqrt

给定一个数 \(X\) ,可以在 $[1,\lfloor { \sqrt{X} }\rfloor ] $ 中选择一个数接在当前数的后面,依此类推进行无限次,求最后能得到多少种不同的数列。

\(1\le X\le9e18\)

此题的启示:如果根号算法还是太慢,考虑计算根号时可能存在的重复状态。

你发现最后肯定开平方开到 \(1\) 去。

显然的做法,设 \(f_i\) 是数字 \(i\) 能形成的不同数列个数,那么 \(f_i=\sum_{j=1}^{\lfloor { \sqrt{X} }\rfloor}{f_j}\)

\(O(\sqrt{X})\) 的做法,肯定超时。

注意一个性质,在计算 \(f_1,f_2,...,f_{\sqrt{x}}\) 的过程中,涉及到的 \(f\) 数组不同下标数量只会有大约 \(X^\frac{1}{4}\) 种不同的数。

证明很显然,根号下再次开根即可,如果仍然不理解,手算 \(f_{16}\) 估计就理解了。

也就是说,之前的暴力 \(DP\) ,计算了很多重复状态 (比如每次都会计算 \(f_1\) ,几乎每次都会计算 \(f_2\) \(......\) 等等),那么直接枚举 \(X\) 的子二代(就是把计算 \(f_X\) 需要的每个 \(1,2,...,\sqrt{X}\) ,都再次用暴力 \(DP\) 拆一次得到的那些数),考虑当前子二代中枚举到 \(i\) ,那么在子一代中,\([i^2,\sqrt{X}]\) 这些数字都会包含 \(i\) 的计算项,于是 \(i\) 对应的方案 \(f_i\) 对总答案贡献 \(\sqrt{x}-i^2+1\) 次。

方程显然,只需要枚举到 \(X^\frac{1}{4}\) 即可,可以通过。

EX题 Builder Takahashi (Enhanced version)

\(min-max\) 容斥搞一波,具体还不是很会。

posted @ 2022-03-29 21:32  Constant1227  阅读(138)  评论(0)    收藏  举报