Cod sursa(job #1975358)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 30 aprilie 2017 16:56:32
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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;
		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);
	int nl = 0;

	for (int i = lowest[len - 1]; i >= 0; i = prevIndex[i])
		reverse[nl++] = v[i];
		//g << v[i] << " ";
	for (int i = nl - 1; i >= 0; i--)
		g << reverse[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;
}