Pagini recente » Cod sursa (job #1315049) | Cod sursa (job #476030) | Cod sursa (job #1999089) | Cod sursa (job #1220848) | Cod sursa (job #1377812)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
ifstream fin ("scmax.in");
ifstream fout("scmax.out");
int N; fin >> N;
vector<int> arr;
for(int i = 0; i < N; ++i) {
int x; fin >> x;
arr.push_back(x);
}
vector<int> h;
vector<int> best;
vector<int> prev; prev.push_back(-1);
best.push_back(1);
h.push_back(0);
h.push_back(0);
int len = 2;
for(int i = 1; i < N; ++i) {
bool found = false;
for(int j = len - 1; j >= 1; --j) {
// cout << "i:" << i << " j:" << j << " arr[i]:" << arr[i] << " hash[j]:" << h[j] << " arr[hash[j]]:" << arr[h[j]] << "\n";
if(arr[i] > arr[h[j]]) {
prev.push_back(h[j]);
best.push_back(1 + best[h[j]]);
if(len <= j + 1) {
h.push_back(i);
++len;
}
else {
if(arr[i] < arr[h[j+1]]) {
h[j+1] = i;
}
}
found = true;
break;
}
}
if(!found) {
best.push_back(1);
prev.push_back(-1);
if(arr[i] < arr[h[1]]) {
h[1] = i;
}
}
}
/*
cout << "arr:\n";
for(int i = 0; i < N; ++i) {
cout << arr[i] << " ";
}
cout << '\n';
cout << "best:\n";
for(int i = 0; i < N; ++i) {
cout << best[i] << " ";
}
cout << '\n';
cout << "prev:\n";
for(int i = 0; i < N; ++i) {
cout << prev[i] << " ";
}
cout << '\n';
cout << "hash:\n";
for(int i =0; i < len; ++i) {
cout << h[i] << " ";
}
cout << '\n';
cout << "arr[hash]:\n";
for(int i =0; i < len; ++i) {
cout << arr[h[i]] << " ";
}
cout << '\n';
*/
cout << (len - 1) << "\n";
int pos = h[len - 1];
vector<int> solArray;
int solLen = 1;
solArray.push_back(arr[pos]);
while(prev[pos] != -1) {
solArray.push_back(arr[prev[pos]]);
pos = prev[pos];
++solLen;
}
cout << solArray[solLen - 1];
for(int i = solLen - 2; i >= 0; --i) {
cout << " " << solArray[i];
}
cout << "\n";
return 0;
}