https://www.acmicpc.net/problem/12014
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb = new StringBuilder();
static Reader scanner = new Reader();
static int caseNum;
static int N;
static int K;
static int[] stockPrices;
static void input() {
N = scanner.nextInt();
K = scanner.nextInt();
stockPrices = new int[N];
for(int idx = 0; idx < N; idx++) {
stockPrices[idx] = scanner.nextInt();
}
}
// K일 동안 직전에 주식을 샀을 때보다 가격이 올라갔을 때만 주식을 사기 위해서는 가장 긴 증가하는 부분 수열의 길이가 K보다 크거나 같으면 된다
// 그렇기 때문에 각 케이스에서 LIS의 길이를 구하여 해당 길이가 K보다 크거나 같다면 거래가 가능하므로 1을, K보다 작다면 거래가 불가능하므로 0을 출력하면 된다
// 이때 N보다 K가 클 경우, 알고있는 주식의 일수보다 거래해야하는 일수인 K가 더 크기 때문에 애초에 K일만큼 거래할 수 없으므로 0을 출력한다
static void solution() {
sb.append("Case #").append(caseNum++).append('\n');
if(N < K) {
sb.append(0).append('\n');
return;
}
List<Integer> lis = new ArrayList<>();
lis.add(0);
for(int idx = 0; idx < N; idx++) {
if(lis.get(lis.size() - 1) < stockPrices[idx]) {
lis.add(stockPrices[idx]);
} else {
int lisIdx = getLisIdx(stockPrices[idx], lis);
lis.set(lisIdx, stockPrices[idx]);
}
}
int lisSize = lis.size() - 1 == 0 ? 1 : lis.size() - 1;
if(K <= lisSize) {
sb.append(1).append('\n');
} else {
sb.append(0).append('\n');
}
}
static int getLisIdx(int target, List<Integer> lis) {
int left = 1;
int right = lis.size() - 1;
while(left < right) {
int mid = (left + right) / 2;
if(lis.get(mid) < target) {
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
public static void main(String[] args) {
caseNum = 1;
int T = scanner.nextInt();
while(T-- > 0) {
input();
solution();
}
System.out.print(sb);
}
static class Reader {
BufferedReader br;
StringTokenizer st;
public Reader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}