Cod sursa(job #1975367)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 30 aprilie 2017 17:21:53
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
									
ifstream f("scmax.in");
ofstream g("scmax.out");

int binsearch(int v[], vector<int> &T, int l, int r, int val)
{
	int mid;
	while (l < r)
	{
		mid = (l+r)/2;	//	2 7 1 4 3
		if (v[T[mid]] < val)
			l = mid + 1;
		else
			r = mid - 1;
	}
	return mid;

}

void LIS(int v[], int n)
{
	vector <int> lowest(n, 0);
	vector <int> prevIndex(n, -1);
	int len = 1;

	for (int i = 1; i < n; i++)
	{
		//if current element is lower than the lowest
		if (v[i] < v[lowest[0]])
			lowest[0] = i;
		//if current element is bigger than the biggest add it to subsequence
		else if (v[i] > v[lowest[len - 1]])
		{
			prevIndex[i] = lowest[len - 1];
			lowest[len++] = i;
		}
		else
		{
			//search the lowest element that is bigger than v[i](current el) and change it with v[i]
			int pos = binsearch(v, lowest, 0, len, v[i]);

			prevIndex[i] = lowest[pos - 1];
			lowest[pos] = i;

		}
	}
	//		0 1 2 
	//v		3 5 4 15 15 8
	//low	
	//prev	
	g << len << endl;

	vector <int> reverse(n, 0);
	vector <int> sol(n, 0);
	int nl = 0;
	int sn = 0;
	for (int i = lowest[len - 1]; i >= 0; i = prevIndex[i])
		reverse[nl++] = v[i];
	//g << v[i] << " ";
	for (int i = 0; i < nl; i++)
	{
		if (reverse[i] == reverse[i + 1] )
		{

			while (reverse[i] == reverse[i + 1] && i < nl)
				i++;
		}
		sol[sn++] = reverse[i];
	}
	for (int i = sn - 1; i >= 0; i--)
		g << sol[i] << " ";
}

int main()
{
	int n;
	int v[100000];
	f >> n;

	for (int i = 0; i < n; i++)
	{
		f >> v[i];
	}

	LIS(v, n);

	//char t;
	//cin >> t;
}