Pagini recente » Cod sursa (job #1451579) | Cod sursa (job #1214181) | Cod sursa (job #296078) | Cod sursa (job #2216460) | Cod sursa (job #2458142)
#include <algorithm>
#include <fstream>
#include <iterator>
#include <vector>
std::vector<int> solve(std::vector<int> &V)
{
std::vector<int> scmax, tails, DP;
for (auto v : V)
{
auto it = std::lower_bound(tails.begin(), tails.end(), v);
int scLen = std::distance(tails.begin(), it);
if (tails.size() <= scLen)
{
tails.push_back(v);
}
else
{
tails[scLen] = std::min(tails[scLen], v);
}
DP.push_back(scLen + 1);
}
int scmaxLen = tails.size();
for (size_t i = V.size(); i > 0 && scmaxLen > 0; i--)
{
if (DP[i - 1] == scmaxLen)
{
scmax.push_back(V[i - 1]);
scmaxLen--;
}
}
return std::vector<int>(scmax.rbegin(), scmax.rend());
}
std::vector<int> read();
void write(std::vector<int> &v);
int main()
{
auto v = read();
auto scmax = solve(v);
write(scmax);
return 0;
}
std::vector<int> read()
{
std::ifstream fin("scmax.in");
int n;
std::vector<int> v;
fin >> n;
std::copy_n(std::istream_iterator<int>(fin), n, std::back_inserter(v));
return v;
}
void write(std::vector<int> &v)
{
std::ofstream fout("scmax.out");
fout << v.size() << '\n';
std::copy_n(v.begin(), v.size(), std::ostream_iterator<int>(fout, " "));
fout << '\n';
}