package main import ( "bufio" "fmt" "os" "sort" "strconv" ) type email struct { w int h int } func main() { for { scanner := bufio.NewScanner(os.Stdin) // 设置大缓冲区,防止大输入时出错 buf := make([]byte, 1024*1024) // 1MB scanner.Buffer(buf, 1024*1024) scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔) // 读取第一行:n scanner.Scan() num, _ := strconv.Atoi(scanner.Text()) if num == 0 { break } arr := make([]email, num) for i := 0; i < len(arr); i++ { scanner.Scan() w, _ := strconv.Atoi(scanner.Text()) scanner.Scan() h, _ := strconv.Atoi(scanner.Text()) arr[i] = email{w, h} } fmt.Println(process(arr)) } } func process(arr []email) int { sort.Slice(arr, func(i, j int) bool { if arr[i].w == arr[j].w { return arr[i].h > arr[j].h // 高度需要从高到低,保证后续LIS问题求解时,严格递增 } return arr[i].w < arr[j].w }) h := make([]int, len(arr)) for i := 0; i < len(arr); i++ { h[i] = arr[i].h } return LIS(h) } func LIS(arr []int) int { res := []int{} for _, v := range arr { l, r := 0, len(res) for l < r { mid := (r-l)/2 + l if res[mid] >= v { r = mid } else { l = mid + 1 } } if l == len(res) { res = append(res, v) } else { res[l] = v } } return len(res) }