Pagini recente » Cod sursa (job #1654812) | Cod sursa (job #937666) | Cod sursa (job #3342074) | Cod sursa (job #1128362) | Cod sursa (job #931656)
Cod sursa(job #931656)
//o(n log n) cu ideea lui francu
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 100005
using namespace std;
int n, m;
vector <int> q, sol;
int v[nmax], h[nmax];
void insert(int i) {
int val = v[i];
int lo = -1;
int hi = q.size();
int mid;
if(q.empty() || val > q[q.size()-1]) {
q.push_back(val);
h[i] = q.size();
return;
}
while(hi - lo > 1) {
mid = lo + (hi - lo) / 2;
if(val >= q[mid]) lo = mid;
else hi = mid;
}
while(val >= q[lo]) lo++;
q[hi] = val;
h[i] = hi + 1;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
f>>n;
for(int i=1; i<=n; i++) {
f>>v[i];
insert(i);
//cout<<"l-am pus pe "<<v[i]<<" si am obtinut ";
//if(v[i] < 10) cout<<" ";
//for(int j=0; j<q.size(); j++) cout<<q[j]<<" "; cout<<"\n";
}
int dim = q.size();
g<<dim<<"\n";
cout<<dim<<"\n";
int l = dim, i = n;
while(l > 0) {
while(h[i] != l) i--;
sol.push_back(v[i]);
l--;
}
for(i=sol.size()-1; i>=0; i--) g<<sol[i]<<" ";
return 0;
}