AcWing 896. 最长上升子序列 II(超时的nlogn)
原题链接
中等
作者:
奋斗吧
,
2020-10-13 23:33:19
,
所有人可见
,
阅读 380
import java.util.*;
class Pair{
int num;//大小
int len;//长度
public Pair(int num,int len){
this.num = num;
this.len = len;
}
}
public class Main{
static Pair[] pairs = new Pair[100010];
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i=1;i<=n;i++) pairs[i] = new Pair(scan.nextInt(),1);
for(int i=2;i<=n;i++){
Arrays.sort(pairs,1,i,new Comparator<Pair>(){
@Override
public int compare(Pair o1,Pair o2){
return Integer.compare(o1.num,o2.num);
}
});
//得到第一个比第i个数大或者等于的数的索引
int index = get(pairs,1,i-1,pairs[i].num);
//可能全是大于等于第i个数的索引
if(index==i-1&&pairs[index].num<pairs[i].num){
index++;
}
//如果index为1说明没有比第i个数大或者等于的数的索引
if(index==1) continue;
Arrays.sort(pairs,1,index,new Comparator<Pair>(){
@Override
public int compare(Pair o1,Pair o2){
return Integer.compare(o1.len,o2.len);
}
});
pairs[i].len = pairs[index-1].len+1;
}
int len_max = -1;
for(int i=1;i<=n;i++)
if(pairs[i].len>len_max) len_max = pairs[i].len;
System.out.print(len_max);
}
static int get(Pair[] a,int left,int right,int x){
while(left<right){
int mid = (left+right)>>1;
if(a[mid].num>=x) right = mid;
else left = mid+1;
}
return left;
}
}