Cod sursa(job #1759305)

Utilizator andreioneaAndrei Onea andreionea Data 18 septembrie 2016 20:17:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>

struct file_manip {

	std::ifstream fin;
	std::ofstream fout;

	file_manip(const char* filename) {
		std::string infilename  = std::string(filename) + ".in";
		std::string outfilename = std::string(filename) + ".out";
		fin.open(infilename.c_str());
		fout.open(outfilename.c_str());
	}

	template <class T>
	file_manip& operator << (const T& rhs) {
		fout << rhs;
		return *this;
	}
	template <class T>
	file_manip& operator >> (T& rhs) {
		fin >> rhs;
		return *this;
	}
};

int main()
{
	{
		file_manip fm("scmax");
		int N;
		fm >> N;
		std::vector<int> v;
		std::vector<int> prev, bestIdx;
		v.reserve(N);
		prev.reserve(N);
		bestIdx.reserve(N);
		std::generate_n(std::back_inserter(v), N, [&fm]() { int x; fm >> x; return x;});
		bestIdx.push_back(-1); 
		for (int i = 0; i < N; ++i) {
			int fst = 1, lst = bestIdx.size() - 1;
			while (fst <= lst) {
				int mid = ((fst + lst) / 2) + ((fst + lst) % 2);
				if (v[bestIdx[mid]] < v[i])
					fst = mid + 1;
				else {
					lst = mid - 1;
				}
			}

			prev.push_back(bestIdx[fst - 1]);

			if (fst == bestIdx.size() ){
				bestIdx.push_back(i);
			}
			else
			{
				bestIdx[fst] = i;
			}
		}
		std::stack<int> solution;
		fm << bestIdx.size() - 1 << "\n";
		int idx = bestIdx.back();
		while (idx >= 0) {
			solution.push(idx);
			idx = prev[idx];
		}
		while (!solution.empty()) {
			fm << v[solution.top()] << " ";
			solution.pop();
		}
		fm << "\n";
	}

	return 0;
}