D - Digit vs Square Root
题解
首先是朴素解法,每次遍历 \(n\) 然后查看 每个数的平方根是否是其前缀
时间复杂度 \(O(T\cdot n\cdot \log n)\)
这里有两个数,一个是 \(x\),即一个整数,一个是 \(y\),是 \(x\) 的平方根,因此我们可以换一个视角.
统计对于每一个整数 \(x\),有多少 \(y\in [x^2,(x+1)^2)\) 满足 \(x\) 是 \(y\) 的前缀
这样似乎简单了一点,为什么呢,举个例子:
假如 \(x\) 是 \(abcd\)
那么 \(y\) 一定是 \(abcd*\)
其中 \(*\in[00...00,99...99]\)
所以合法的 \(y\) 一定是某一段连续的区间
我们只需要取合法的 \(y\) 所在的区间和区间 \([x^2,(x+1)^2)\) 的并集即可
这样的时间复杂度为(预处理) \(o(\sqrt{n}+T)\)
还是有点高