Pagini recente » Cod sursa (job #3186832) | Cod sursa (job #3236062) | Cod sursa (job #896023) | Cod sursa (job #2412085) | Cod sursa (job #2371204)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#define ll long long
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int INF = 2000000005;
int main() {
int n;
in >> n;
vector<int> v(n + 1, 0);
for(int i = 1; i <= n; i ++)
in >> v[i];
vector<int> dp(n + 1, INF);
vector<int> best(n + 1, 0);
for(int i = 1; i <= n; i ++) {
int ans = 0;
for(int step = (1 << 16); step; step >>= 1)
if(ans + step <= n && dp[ans + step] < v[i])
ans += step;
dp[ans + 1] = min(dp[ans + 1], v[i]);
best[i] = max(best[i], ans + 1);
}
for(int i = n; i >= 1; i --) {
if(dp[i] != INF) {
out << i << "\n";
vector<int> sol;
int curr = i, last = INF;
for(int j = n; j >= 1; j --) {
if(curr > 0 && best[j] >= curr && v[j] < last) {
sol.push_back(v[j]);
last = v[j];
curr --;
}
}
reverse(sol.begin(), sol.end());
for(auto it : sol)
out << it << " ";
break;
}
}
return 0;
}