Pagini recente » Cod sursa (job #328490) | Cod sursa (job #2120583) | Cod sursa (job #253557) | Cod sursa (job #266238) | Cod sursa (job #1759305)
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
struct file_manip {
std::ifstream fin;
std::ofstream fout;
file_manip(const char* filename) {
std::string infilename = std::string(filename) + ".in";
std::string outfilename = std::string(filename) + ".out";
fin.open(infilename.c_str());
fout.open(outfilename.c_str());
}
template <class T>
file_manip& operator << (const T& rhs) {
fout << rhs;
return *this;
}
template <class T>
file_manip& operator >> (T& rhs) {
fin >> rhs;
return *this;
}
};
int main()
{
{
file_manip fm("scmax");
int N;
fm >> N;
std::vector<int> v;
std::vector<int> prev, bestIdx;
v.reserve(N);
prev.reserve(N);
bestIdx.reserve(N);
std::generate_n(std::back_inserter(v), N, [&fm]() { int x; fm >> x; return x;});
bestIdx.push_back(-1);
for (int i = 0; i < N; ++i) {
int fst = 1, lst = bestIdx.size() - 1;
while (fst <= lst) {
int mid = ((fst + lst) / 2) + ((fst + lst) % 2);
if (v[bestIdx[mid]] < v[i])
fst = mid + 1;
else {
lst = mid - 1;
}
}
prev.push_back(bestIdx[fst - 1]);
if (fst == bestIdx.size() ){
bestIdx.push_back(i);
}
else
{
bestIdx[fst] = i;
}
}
std::stack<int> solution;
fm << bestIdx.size() - 1 << "\n";
int idx = bestIdx.back();
while (idx >= 0) {
solution.push(idx);
idx = prev[idx];
}
while (!solution.empty()) {
fm << v[solution.top()] << " ";
solution.pop();
}
fm << "\n";
}
return 0;
}