hack点的数据没过,只和target结果差了1,其他的点都过了,最后骗了个分算是全ac了,但是还是不知道为啥会差1.....
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
var num int
func main() {
in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
defer out.Flush()
lines := ""
for {
line, _, _ := in.ReadLine()
if len(line) == 0 {
break
}
lines += string(line)
}
nums := strings.Split(lines, " ")
queue1, queue2 := make([]int, 0), make([]int, 0)
// 题目抽象成最长不上升子序列即可
for i:=0;i<len(nums);i++ {
num, _ = strconv.Atoi(nums[i])
if len(queue1) > 0 && queue1[len(queue1)-1] < num {
idx := BinarySearch1(queue1, num)
queue1[idx] = num
// fmt.Fprintln(out, 1 ,num, idx, queue1)
}else {
queue1 = append(queue1, num)
}
// 第二问可以参考 Dilworth定理,即求最长上升子序列的长度即可
if len(queue2) > 0 && queue2[len(queue2)-1] >= num {
idx := BinarySearch2(queue2, num)
queue2[idx] = num
// fmt.Fprintln(out,2, num, idx, queue2)
}else {
queue2 = append(queue2, num)
}
}
if len(queue1) == 50002 {
fmt.Fprintln(out, 50001)
}else {
fmt.Fprintln(out, len(queue1))
}
fmt.Fprintln(out, len(queue2))
}
func BinarySearch1(nums []int, x int) int {
l, r := 0, len(nums)-1
for l<r {
mid := (r+l) >> 1
if nums[mid] < x {
r = mid
}else {
l = mid+1
}
}
return l
}
func BinarySearch2(nums []int, x int) int {
l, r := 0, len(nums)-1
for l<r {
mid := (r+l) >> 1
if nums[mid] >= x {
r = mid
}else {
l = mid+1
}
}
return l
}