Pagini recente » Cod sursa (job #34686) | Cod sursa (job #375341) | Cod sursa (job #13143) | Cod sursa (job #2976010) | Cod sursa (job #514875)
Cod sursa(job #514875)
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int main() {
int n;
fin >> n;
// minim[i] = pozitia elementului cu valoarea minima in care se termina un subsir creascator de lungime i
vector<int> minim(n+1);
// prec[i] = pozitia precedenta pentru un subsir crescator maximal care se termina in i
vector<int> prec(n+1);
minim[0] = 0; prec[0] = -1;
int lmax = 0;
vector<int> v(n+1);
v[0] = 0;
for (int i=0; i<n; i++) fin >> v[i+1];
for (int i=1; i<=n; i++) {
int val = v[i];
if (val > v[minim[lmax]]) {
lmax++;
minim[lmax] = i;
prec[i] = minim[lmax-1];
} else {
int li = 0, ls = lmax;
while (ls - li > 1) {
int mid = (li+ls)/2;
if (val > v[minim[mid]]) li = mid;
else ls = mid;
}
if (v[minim[li+1]] > val) {
minim[li+1] = i;
prec[i] = minim[li];
}
// fout << li << " ";
}
/*for (int j = lmax; j >= 0; j--)
if (val > v[minim[j]]) {
if (j == lmax || v[minim[j+1]] >= val) {
minim[j+1] = i;
lmax = max(lmax, j+1);
prec[i] = minim[j];
// fout << j << endl;
}
break;
}
*/
}
fout << lmax << endl;
vector<int> sol(lmax);
for (int pos=minim[lmax]; lmax; pos = prec[pos]) {
sol[lmax-1] = v[pos];
lmax--;
}
for (int i=0; i<sol.size(); i++)
fout << sol[i] << " " ;
fout << endl;
return 0;
}