Pagini recente » Cod sursa (job #1867199) | Cod sursa (job #1960841) | Cod sursa (job #2191030) | Cod sursa (job #2100803) | Cod sursa (job #2433149)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
string const inFile = "scmax.in";
string const outFile = "scmax.out";
ifstream Read(inFile);
ofstream Write(outFile);
unsigned BinarySearch(vector<unsigned> const &sorted, unsigned const value) {
int left = 0;
int right = sorted.size();
int mid;
while (left < right) {
mid = (left + right) >> 1;
if (sorted[mid] < value) {
left = mid + 1;
}
else {
right = mid;
}
}
return left;
}
void BuildSequence(vector<unsigned> const &vec, vector<unsigned> const &length) {
vector<unsigned> sequence;
unsigned maxLength = 0;
unsigned maxLengthIndex = 0;
for (unsigned i = 0; i < length.size(); ++i) {
if (length[i] > length[maxLengthIndex]) {
maxLengthIndex = i;
}
}
maxLength = length[maxLengthIndex];
Write << maxLength << '\n';
sequence.resize(maxLength);
sequence[maxLength - 1] = vec[maxLengthIndex];
--maxLength;
for (unsigned i = length.size() - 1; int(i) >= 0; --i) {
if (length[i] == maxLength)
if (vec[i] < vec[maxLengthIndex]) {
maxLengthIndex = i;
sequence[maxLength - 1] = vec[i];
--maxLength;
}
}
for (unsigned i = 0; i < sequence.size(); ++i) {
Write << sequence[i] << ' ';
}
}
int main() {
unsigned n;
vector<unsigned> vec;
vector<unsigned> sorted;
vector<unsigned> length;
unsigned elementPos;
Read >> n;
vec.resize(n);
length.resize(n);
for (unsigned i = 0; i < n; ++i) {
Read >> vec[i];
elementPos = BinarySearch(sorted, vec[i]);
if (elementPos >= sorted.size()) {
sorted.push_back(vec[i]);
}
else {
sorted[elementPos] = vec[i];
}
length[i] = elementPos + 1;
}
BuildSequence(vec, length);
return 0;
}