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)
}