Pagini recente » Cod sursa (job #3268725) | Cod sursa (job #2328307) | Cod sursa (job #1221107) | Cod sursa (job #1725696) | Cod sursa (job #1836061)
import java.util.*;
import java.io.*;
class Main {
static int n;
static int[] numbers;
static int[] longestSubsequence;
static int[] last;
static int[] minValueIndex;
private static void readInput(Scanner scanner) {
n = scanner.nextInt();
numbers = new int[n + 1];
longestSubsequence = new int[n + 1];
last = new int[n + 1];
minValueIndex = new int[n + 1];
for (int i = 0; i < n; i++)
numbers[i] = scanner.nextInt();
}
private static int search(int x, int right) {
int left = 1;
int position = 0;
if (x > numbers[minValueIndex[right]]) return right;
while(left <= right) {
int middle = (left + right) / 2;
if (numbers[minValueIndex[middle]] >= x) {
position = middle;
right = middle - 1;
}
else left = middle + 1;
}
return position - 1;
}
private static void updateMinValues(int index) {
int length = longestSubsequence[index];
int currentValue = numbers[minValueIndex[length]];
if (currentValue <= numbers[index]) return;
minValueIndex[length] = index;
}
private static void writeSequence(int index, PrintWriter writer) {
if (index == -1) return;
writeSequence(last[index], writer);
writer.print(numbers[index]);
writer.print(' ');
}
private static void writeOutput(PrintWriter writer) {
int maxIndex = 0;
for (int i = 0; i < n; i++) {
if (longestSubsequence[i] > longestSubsequence[maxIndex])
maxIndex = i;
}
writer.print(longestSubsequence[maxIndex]);
writer.print('\n');
writeSequence(maxIndex, writer);
writer.print('\n');
}
public static void main(String []args) {
File inputFile = new File("scmax.in");
File outputFile = new File("scmax.out");
try {
FileInputStream inputStream = new FileInputStream(inputFile);
Scanner scanner = new Scanner(inputStream);
readInput(scanner);
inputStream.close();
minValueIndex[1] = 0;
last[0] = -1;
longestSubsequence[0] = 1;
int right = 1;
for (int i = 1; i < n; i++) {
int prev = search(numbers[i], right);
if (prev == 0) {
last[i] = -1;
longestSubsequence[i] = 1;
updateMinValues(i);
continue;
}
prev = minValueIndex[prev];
last[i] = prev;
longestSubsequence[i] = longestSubsequence[prev] + 1;
if (longestSubsequence[i] > right) {
right = longestSubsequence[i];
minValueIndex[right] = i;
}
updateMinValues(i);
}
try {
FileOutputStream outputStream = new FileOutputStream(outputFile);
PrintWriter writer = new PrintWriter(outputStream);
writeOutput(writer);
writer.close();
outputStream.close();
} catch(IOException e) {
}
} catch(IOException e) {
}
}
}