技巧
二分
思路
找到 1e9 范围内所有整数平方根数组 最大长度就是 根号1e9 + 1
二分查找范围l和r ,找到对应的索引。 计算差值个数。
实现
package main import ( "bufio" . "fmt" "io" "math" "os" ) func main() { NC14733(os.Stdin, os.Stdout) } // https://ac.nowcoder.com/acm/problem/14733 func NC14733(_r io.Reader, _w io.Writer) { in, out := bufio.NewReader(_r), bufio.NewWriter(_w) defer out.Flush() // 构建满足 0 - 1000000000的整数平分根 maxNum := int(math.Sqrt(float64(1000000000))) sqrtArr := make([]int, maxNum+1) for i := 1; i <= maxNum; i++ { sqrtArr[i] = i * i } // 参数输入 var n int for Fscan(in, &n); n > 0; n-- { var l, r int Fscan(in, &l, &r) // 二分查找 // >= l 的最左位置 li, ri := 0, len(sqrtArr)-1 for li <= ri { mid := (li + ri) / 2 if sqrtArr[mid] >= l { ri = mid - 1 } else { li = mid + 1 } } lIndex := li // <=r的最右位置 li, ri = 0, len(sqrtArr)-1 for li <= ri { mid := (li + ri) / 2 if sqrtArr[mid] <= r { li = mid + 1 } else { ri = mid - 1 } } rIndex := ri // 输出答案个数 Fprintln(out, rIndex-lIndex+1) } }