Cod sursa(job #2905513)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 22 mai 2022 11:03:52
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#include <iostream>

int v[100002];
int maxLen[100002];
int minLast[100002];
int minLastPos[100002];
int previous[100002];
int r[100002];

int main() {
  FILE *fin, *fout;
  int n;
  int i, mijloc;
  int stanga, dreapta, bestLast;
  int res, ind;

  fin = fopen("scmax.in", "r");

  fscanf(fin, "%d", &n);
  for (i = 0; i < n; i++)
    fscanf(fin, "%d", &v[i]);

  fclose(fin);

  minLast[0] = 0;
  for (i = 1; i <= n; i++)
    minLast[i] = 2000000001;

  res = 1;
  for (i = 0; i < n; i++) {
    stanga = 0;
    dreapta = i + 1;
    // minLast[i + 1] == 2000000000
    while (dreapta - stanga > 1) {
      int mij = (stanga + dreapta) / 2;
      if (minLast[mij] < v[i])
        stanga = mij;
      else
        dreapta = mij;
    }

    if (minLast[dreapta] > v[i])
      minLastPos[dreapta] = i + 1;
    minLast[dreapta] = std::min(minLast[dreapta], v[i]);
    previous[i] = minLastPos[dreapta - 1];
    maxLen[i] = dreapta;
    if (res < dreapta) {
      res = dreapta;
      bestLast = i;
    }

    //printf("%d %d %d minLast: ", stanga, dreapta, minLast[stanga] < v[i]);
    //for (int j = 0; minLast[j] != 2000000000; j++)
      //printf("%d ", minLast[j]);
    //printf("maxLen: ");
    //for (int j = 0; j <= i; j++)
      //printf("%d ", maxLen[j]);
    //printf("minLastPos: ");
    //for (int j = 0; j <= n; j++)
      //printf("%d ", minLastPos[j]);
    //printf("previous: ");
    //for (int j = 0; j <= n; j++)
      //printf("%d ", previous[j]);
    //printf("\n");
  }

  fout = fopen("scmax.out", "w");

  fprintf(fout, "%d\n", res);

  ind = 0;
  i = bestLast;
  while (i >= 0) {
    r[ind++] = v[i];
    i = previous[i] - 1;
  }

  for (ind--; ind >= 0; ind--)
    fprintf(fout, "%d ", r[ind]);

  fclose(fout);

  return 0;
}