Cod sursa(job #1836061)

Utilizator diana97Diana Ghinea diana97 Data 27 decembrie 2016 19:35:06
Problema Subsir crescator maximal Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 2.81 kb
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) {

    }
  }
}