Cod sursa(job #1377813)

Utilizator laurenttlaurentiu pavel laurentt Data 6 martie 2015 06:41:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;


int main() {
  ifstream fin ("scmax.in");
  ofstream fout("scmax.out");

  int N; fin >> N;
  vector<int> arr;
  for(int i = 0; i < N; ++i) {
    int x; fin >> x;
    arr.push_back(x);
  }

  vector<int> h;
  vector<int> best;
  vector<int> prev; prev.push_back(-1);
  best.push_back(1);
  h.push_back(0);
  h.push_back(0);
  int len = 2;
  
  for(int i = 1; i < N; ++i) {
    bool found = false;
    
    for(int j = len - 1; j >= 1; --j) {
      //      cout << "i:" << i << " j:" << j << " arr[i]:" << arr[i] << " hash[j]:" << h[j] << " arr[hash[j]]:" << arr[h[j]] << "\n";
      if(arr[i] > arr[h[j]]) {
	prev.push_back(h[j]);
	best.push_back(1 + best[h[j]]);
	if(len <= j + 1) {
	  h.push_back(i);
	  ++len;
	}
	else {
	  if(arr[i] < arr[h[j+1]]) {
	    h[j+1] = i;
	  }
	}
	found = true;
	break;
      }
    }
    if(!found) {
      best.push_back(1);
      prev.push_back(-1);
      if(arr[i] < arr[h[1]]) {
	h[1] = i;
      }
    }    
  }
  /*
  cout << "arr:\n";
  for(int i = 0; i < N; ++i) {
    cout << arr[i] << " ";
  }
  cout << '\n';
  cout << "best:\n";
  for(int i = 0; i < N; ++i) {
    cout << best[i] << " ";
  }
  cout << '\n';
  cout << "prev:\n";
  for(int i = 0; i < N; ++i) {
    cout << prev[i] << " ";
  }
  cout << '\n';
  cout << "hash:\n";
  for(int i =0; i < len; ++i) {
    cout << h[i] << " ";
  }
  cout << '\n';
  cout << "arr[hash]:\n";
  for(int i =0; i < len; ++i) {
    cout << arr[h[i]] << " ";
  }
  cout << '\n';
  */
  fout << (len - 1) << "\n";
  int pos = h[len - 1];
  vector<int> solArray;
  int solLen = 1;
  solArray.push_back(arr[pos]);
  while(prev[pos] != -1) {
    solArray.push_back(arr[prev[pos]]);
    pos = prev[pos];
    ++solLen;
  }

  
  fout << solArray[solLen - 1];
  for(int i = solLen - 2; i >= 0; --i) {
    fout << " " << solArray[i];
  }
  fout << "\n";
  
  return 0;
}