MY APPROACH
I have an array which stores the top disk of each stack. If the max of this array < new disk, a new stack is created. If max > new disk size, I do a binary search in the array to find the index of disk just greater than the new disk and then replace that with the new disk.
CODE
static int lowest_just_greater(ArrayList<Integer> ar, int k){
int l=0, r=ar.size()-1;
int ans=0;
while(l<=r){
int mid= l+(r-l)/2;
// if(ar.get(mid)==k) return mid+1;
if(ar.get(mid)>k) {
ans=mid;
r=mid-1;
}
else l=mid+1;
}
return ans;
}
public void solveTheProblem(InputReader in,OutputWriter out, NumberTheory nt){
int test=in.nextInt();
while(test-- >0){
int n=in.nextInt();
int ar[]= new int[n];
// for(int i=0;i<n;i++) ar[i]=Integer.MAX_VALUE;
int max=-1;
int size=0;
ArrayList<Integer> stacks= new ArrayList<>();
stacks.add(in.nextInt());
max=stacks.get(0);
// ar[size++]=in.nextInt();
// max=ar[0];
for(int i=1;i<n;i++){
int temp=in.nextInt();
// int k=lowest_just_greater(stacks, temp);
// if(stacks.get(k)>temp) stacks.set(k, temp);
// else stacks.add(temp);
if(temp>=max){
max=temp;
stacks.add(max);
// ar[size++]=temp;
}
else{
int k= lowest_just_greater(stacks, temp);
// System.out.printf("temp: %d\n", temp);
// int k=lowest_just_greater_array(ar, temp);
if(stacks.get(k)==max) max=temp;
// if(ar[k]==max) max=temp;
// System.out.println("--- max: "+max);
// System.out.println("no: "+temp+" pos: "+k);
stacks.set(k, temp);
// ar[k]=temp;
}
}
// out.print(size+" ");
// String s=stacks.size()+"";
// String s=stacks.size()+"";
// for(int i:stacks) s+=" "+i;
out.print(stacks.size());
for(int i:stacks) out.print(" "+i);
// for(int i=0;i<size;i++) s+=ar[i]+" ";
out.println();
}
}
The submission link:
https://www.codechef.com/viewsolution/34638714
Any help appreciated.