Cod sursa(job #1034747)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 18 noiembrie 2013 01:06:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#define NMAX 100010
using namespace std;

int N;
vector<int> v, subsir, pozitii;

void input() {
	ifstream in("scmax.in");
	in >> N;
	v.resize(N);
	pozitii.resize(N);

	for (int i = 0; i < N; ++i) {
		in >> v[i];
	}
	in.close();
}

int binSearch(const int &val) {
	int left = 0, right = subsir.size() - 1;
	int best = 0;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (subsir[mid] >= val) {
			best = mid;
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	return best;
}

void scmax() {
	subsir.push_back(v[0]);
	pozitii[0] = 0;

	for (int i = 0; i < N; ++i) {
		if (v[i] > subsir.back()) {
			subsir.push_back(v[i]);
			pozitii[i] = subsir.size() - 1;
			continue;
		}
		//caut in "subsir" cel mai mic element mai mare sau egal cu v[i]:
		int pos = binSearch(v[i]);
		subsir[pos] = v[i];
		pozitii[i] = pos;
	}
}

void output() {
	ofstream out("scmax.out");
	int next = subsir.size() - 1;
	out << next + 1 << "\n";
	vector<int> output;

	int i = N - 1;
	while (next >= 0) {
		if (pozitii[i] == next) {
			output.push_back(v[i]);
			--next;
		}
		--i;
	}

	for (i = subsir.size() - 1; i >= 0; --i) {
		out << output[i] << " ";
	}
	out.close();
}

int main() {
	input();
	scmax();
	output();
	return 0;
}