Cod sursa(job #951663)

Utilizator tudorv96Tudor Varan tudorv96 Data 21 mai 2013 12:42:21
Problema Subsir 2 Scor 44
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

#define in "subsir2.in"
#define out "subsir2.out"
#define N 5005
#define oo -(1 << 30)

vector <int> tmp, sol;
int v[N], last[N], bst[N], MIN[N], tata[N], n, l = 1;

void cmp () {
	//cout << "\nChecking...\n";
	if (!sol.size())
		sol = tmp;
	else {
		int i = sol.size() - 1;
		for (; i >= 0; --i)
			if (v[sol[i]] > v[tmp[i]])
				break;
		if (i >= 0)
			sol = tmp;
	}
}

void Create (int i) {
	tmp.push_back(i);
	if (tata[i])
		Create (tata[i]);
	else 
		cmp();
	tmp.pop_back();
}

int bs (int x) {
	int lo = 0, hi = l;
	while (lo <= hi) {
		int mid = (lo + hi) >> 1;
		if (v[last[mid]] < x && v[last[mid+1]] >= x)
			return mid;
		else
			if (v[last[mid+1]] < x)
				lo = mid + 1;
		else
			hi = mid - 1;
	}
	return l;
}

int main () {
	ifstream fin (in);
	v[N-1] = -oo;
	fin >> n;
	for (int i = 1; i <= n; ++i) {
		fin >> v[i];
		MIN[i] = N-1;
	}
	fin.close();
	bst[1] = last[1] = 1;
	v[0] = oo;
	MIN[bst[1]] = 1;
	for (int i = 2; i <= n; ++i)
		if (v[i] >= v[1]) {
			int c = bs (v[i]);
			bst[i] = c + 1;
			last[c + 1] = i;
			if (v[i] < v[MIN[bst[i]]])
				MIN[bst[i]] = i;
			tata[i] = MIN[bst[i]-1];
			if (l < c + 1)
				l = c + 1;
		}
	ofstream fout (out);
	fout << l << "\n";
	for (int i = 1; i <= last[l]; ++i)
		if (bst[i] == l) {
			Create (i);
			//cout << "Status: ";
			//for (int i = sol.size()-1; i >= 0; --i)
			//	cout << v[sol[i]] << " ";
			//cout << "\n";
		}
	for (int i = sol.size()-1; i >= 0; --i)
		fout << sol[i] << " ";
	fout.close();
	return 0;
}