Cod sursa(job #951665)

Utilizator tudorv96Tudor Varan tudorv96 Data 21 mai 2013 13:04:36
Problema Subsir 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 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], fiu[N], n, l = 1, lmax =-oo;

void cmp () {
	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) {
		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 (tata[i])
			fiu[tata[i]] = i;
		if (l < c + 1)
			l = c + 1;
	}
	for (int i = 1; i <= n; ++i)
		if (bst[i] <= lmax && !fiu[i])
			lmax = bst[i];
	ofstream fout (out);
	fout << lmax << "\n";
	for (int i = 1; i <= last[lmax]; ++i)
		if (bst[i] == lmax)
			Create (i);
	for (int i = sol.size()-1; i >= 0; --i)
		fout << sol[i] << " ";
	fout.close();
	return 0;
}