Cod sursa(job #514875)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 19 decembrie 2010 19:46:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;

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

int main() {
	int n;
	fin >> n;
	// minim[i] = pozitia elementului cu valoarea minima in care se termina un subsir creascator de lungime i
	vector<int> minim(n+1);
	// prec[i] = pozitia precedenta pentru un subsir crescator maximal care se termina in i
	vector<int> prec(n+1);
	minim[0] = 0; prec[0] = -1;
	int lmax = 0;
	vector<int> v(n+1);
	v[0] = 0;
	for (int i=0; i<n; i++) fin >> v[i+1];
	for (int i=1; i<=n; i++) {
		int val = v[i];
		if (val > v[minim[lmax]]) {
			lmax++;
			minim[lmax] = i;
			prec[i] = minim[lmax-1];
		} else {
			int li = 0, ls = lmax;
			while (ls - li > 1) {
				int mid = (li+ls)/2;
				if (val > v[minim[mid]]) li = mid;
				else ls = mid;
			}
			if (v[minim[li+1]] > val) {
				minim[li+1] = i;
				prec[i] = minim[li];
			}
			// fout << li << " ";
		}
		
		/*for (int j = lmax; j >= 0; j--)
			if (val > v[minim[j]]) {
				if (j == lmax || v[minim[j+1]] >= val) {
					minim[j+1] = i;
					lmax = max(lmax, j+1);
					prec[i] = minim[j];
					// fout << j << endl;
				}
				break;
			}
		*/	
	}
	fout << lmax << endl;
	vector<int> sol(lmax);
	for (int pos=minim[lmax]; lmax; pos = prec[pos]) {
		sol[lmax-1] = v[pos];
		lmax--;
	}
	for (int i=0; i<sol.size(); i++)
		fout << sol[i] << " " ;
	fout << endl;
	return 0;
}