Pagini recente » Cod sursa (job #1967373) | Cod sursa (job #2573643) | Cod sursa (job #51137) | Cod sursa (job #2320776) | Cod sursa (job #1975358)
#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;
}