Pagini recente » Cod sursa (job #1301283) | Cod sursa (job #3197974) | Cod sursa (job #865289) | Cod sursa (job #1050219) | Cod sursa (job #2285383)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
void showSequence(int i, const vector< int > &result, const vector< int > &v) {
if(result[i] == -1) {
out << v[i] << " ";
return;
}
showSequence(result[i], result, v);
out << v[i] << " ";
}
int ceilIndexBinarySearch(const vector< int > &v, const vector< int > &temp, const int &len, const int &target) {
int lo = 0;
int hi = len;
while(lo <= hi) {
int mid = (lo + hi) / 2;
if(v[temp[mid]] < target && target < v[temp[mid + 1]]) {
return mid + 1;
}
if(v[temp[mid]] < target) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return -1;
}
void longestIncreasingSubsequence(const vector< int > &v, const int &n) {
vector< int > temp(n), result(n, -1);
int len = 0;
temp[0] = 0;
for(int i = 1; i < n; ++i) {
if(v[i] < v[temp[0]]) {
temp[0] = i;
continue;
}
if(v[i] > v[temp[len]]) {
temp[++len] = i;
result[temp[len]] = temp[len - 1];
continue;
}
int idx = ceilIndexBinarySearch(v, temp, len, v[i]);
temp[idx] = i;
result[i] = i - 1;
}
out << len + 1 << "\n";
showSequence(temp[len], result, v);
}
int main() {
ios::sync_with_stdio(false); in.tie(0); out.tie(0);
int n; in >> n;
vector< int > v(n);
for(auto &it: v) in >> it;
longestIncreasingSubsequence(v, n);
in.close(); out.close();
return 0;
}