Cod sursa(job #1157528)

Utilizator cdt2014Cont de Teste cdt2014 Data 28 martie 2014 16:12:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;

class Scmax {
public:
	Scmax(vector<int> in) : A(in), best(in.size()), P(in.size()) {}

	pair< int, vector<int> > solve() {
		int longest = 0;
		int longestIndex = 0;

		best[0] = 0;
		P[0] = 0;
		for (size_t i=1; i<A.size(); ++i) {
			P[i] = i;
			int l, h;
			for (l=0, h=longest; l<=h; ) {
				int m = (l+h) >> 1;
				if (A[best[m]] == A[i]) { l = m; break; }
				if (A[best[m]] < A[i]) l = m + 1; 
				else h = m - 1;
			}
			if (l > longest) {
				longest ++;
				longestIndex = i;
				best[longest] = i;
				P[i] = best[longest-1];
				continue;
			}

			if (A[i] < A[best[l]]) {
				best[l] = i;
				if (l > 0) P[i] = best[l-1]; 
			}
		}

		vector<int> result;
		for (int i=longestIndex; P[i] != i; i = P[i]) result.push_back(A[i]);
		reverse(result.begin(), result.end());
		return make_pair(longest, result);
	}

private:
	vector<int> A;
	vector<int> best, P;
};

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

	int N;
	in >> N;
	vector<int> A(N);
	while (N--) { int x; in >> x; A.push_back(x); };

	Scmax sc(A);
	pair<int, vector<int> > result = sc.solve();

	out << result.first << "\n";
	ostream_iterator<int> oi(out, " ");
	copy(result.second.begin(), result.second.end(), oi);
	return 0;
}