Pagini recente » Cod sursa (job #3184722) | Cod sursa (job #2252863) | Cod sursa (job #2202773) | Cod sursa (job #583710) | Cod sursa (job #1975367)
#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;
}