Pagini recente » Cod sursa (job #372679) | Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 189 | Diferente pentru implica-te/arhiva-educationala intre reviziile 14 si 223 | Cod sursa (job #1245374) | Cod sursa (job #3288766)
#include <bits/stdc++.h>
#define aaa system("read -r -p \"Press enter to continue...\" key");
#define dbg(x) std::cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) std::cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)std::cerr<<x[_]<<' ';std::cerr<<'\n',aaa
#define dbgs(x) std::cerr<<(#x)<<"[stl]: ";for(auto _:x)std::cerr<<_<<' ';std::cerr<<'\n',aaa
#define dbgp(x) std::cerr<<(#x)<<": "<<x.first<<' '<<x.second<<'\n',aaa
#define dbgsp(x) std::cerr<<(#x)<<"[stl pair]:\n";for(auto _:x)std::cerr<<_.first<<' '<<_.second<<'\n';aaa
int main() {
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n; fin >> n;
std::vector<int> v(n+1), d(n+1), prev(n+1); ///d[j] = z, unde v[z] este cel mai mic sfarsit al unei subsecv crescatoare maximale de lungime j.
for (int i = 1; i <= n; i++) fin >> v[i];
int last_ind = 0;
for (int i = 1; i <= n; i++) {
///daca exista valori pentru d[0], d[1], .., d[k], atunci v[d[0]] < v[d[1]] < .. < v[d[k]].
///pp v[d[2]] = 5, v[d[3]] = 10. v[i] = 7. pot sa adaug doar dupa v[d[2]]. de fapt pot sa adaug doar dupa un element, aleg sa adaug dupa cel mai din dreapta.
int j = 0;
for (int pas = (1 << 17); pas; pas >>= 1) {
if (j + pas < i && d[j+pas] != 0 && v[d[j+pas]] < v[i]) j += pas;
}
if (d[j+1] == 0 || v[d[j+1]] > v[i]) {
d[j+1] = i;
prev[i] = d[j];
if (j+1 == n || d[j+2] == 0) last_ind = i;
}
}
std::vector<int> sol;
while (last_ind) {
sol.push_back(v[last_ind]);
last_ind = prev[last_ind];
}
std::reverse(sol.begin(), sol.end());
fout << sol.size() << '\n';
for (int x: sol) fout << x << ' ';
fout << '\n';
return 0;
}