Nu aveti permisiuni pentru a descarca fisierul grader_test16.ok
Cod sursa(job #3282912)
Utilizator | Data | 7 martie 2025 14:45:35 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.37 kb |
#include <iostream>
#include <random>
#include <fstream>
#include <stack>
using namespace std;
int v[100005], n, dp[100005], k, pos[100005];
void Read()
{
ifstream fin("scmax.in");
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
}
int BinSearch(int val)
{
int left = 1, right = k, mid, p = -1;
while (left <= right)
{
mid = (left + right) / 2;
if (dp[mid] >= val)
{
p = mid;
right = mid - 1;
}
else left = mid + 1;
}
return p;
}
void LIS()
{
ofstream fout("scmax.out");
dp[++k] = v[1];
pos[1] = 1;
for (int i = 2; i <= n; i++)
if (v[i] > dp[k])
{
dp[++k] = v[i];
pos[i] = k;
}
else
{
int p = BinSearch(v[i]);
dp[p] = v[i];
pos[i] = p;
}
fout << k << "\n";
int last = 1;
for (int i = 2; i <= n; i++)
if (pos[i] == k) last = i;
stack<int> st;
st.push(last);
for (int i = last - 1; i >= 1; i--)
if (pos[i] == pos[last] - 1 && v[i] < v[last])
{
last = i;
st.push(last);
}
while (!st.empty())
{
fout << v[st.top()] << " ";
st.pop();
}
}
int main() {
Read();
LIS();
return 0;
}