Cod sursa(job #779370)

Utilizator ELHoriaHoria Cretescu ELHoria Data 17 august 2012 16:24:33
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <vector>
#include <fstream>
template <typename T>void print (T const& coll){ for (typename T::const_iterator pos=coll.begin() ,end(coll.end()); pos!=end; ++pos) fout << *pos << ' ';   fout <<'\n';}

using namespace std;

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

vector<int> getLis(const vector<int> &a) {
	vector<int> b;
	vector<int> p(a.size());
	if(a.empty()) return b;
	b.push_back(0);
	int u , v , mid;
	for(size_t i = 1;i < a.size();++i) {
		
		if(a[i] > a[b.back()]) {
			p[i] = b.back();
			b.push_back(i);
			continue;
		}

		for(u = 0 , v = b.size() - 1;u < v;) {
			mid = u + ((v - u)>>1);
			if(a[b[mid]] < a[i]) u = mid + 1; else v = mid;
		}

		if(a[i] < a[b[u]]) {
			b[u] = i;
			if(u > 0) p[i] = b[u - 1]; 
		}
	}
	for(u = b.size() , v = b.back();u--;v = p[v]) b[u] = v;

	p.clear();
	p.resize(b.size());

	for(size_t i = 0;i < b.size();i++) p[i] = a[b[i]];
	return p;
}

int main()
{
	vector<int> v , ans;
	int N , x;
	fin>>N;
	for(int i = 0;i < N;i++) {
		fin>>x;
		v.push_back(x);
	}
	ans = getLis(v);
	fout<<ans.size()<<'\n';
	print(ans);
	return 0;
}