Pagini recente » Cod sursa (job #1288379) | Cod sursa (job #267421) | Cod sursa (job #3036929) | Cod sursa (job #135513) | Cod sursa (job #2285398)
#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(mid < len && 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 len + 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]]) {
++len;
temp[len] = i;
result[temp[len]] = temp[len - 1];
continue;
}
int idx = ceilIndexBinarySearch(v, temp, len, v[i]);
temp[idx] = i;
result[temp[idx]] = temp[idx - 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;
}