Pagini recente » Cod sursa (job #2766866) | Cod sursa (job #6520) | Cod sursa (job #2714218) | Cod sursa (job #2291947)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
//ifstream fin("scmax.in");
//ofstream fout("scmax.out");
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int sequence[100005];
stack <int> rasp;
int n, lmax;
int v[100005];
int parent[100005];
int solutii[100005];
int caut_bin(int elem)
{
int st = 0, dr = lmax, m;
while (st < dr)
m = (st + dr) >> 1, (v[sequence[m]] < elem) ? st = m + 1 : dr = m;
return st;
}
int find_best_j(int value) {
int l = -1;
int r = lmax;
int m;
while (l + 1 < r) {
m = l + (r - l) / 2;
if (v[sequence[m]] < value) {
l = m;
} else {
r = m;
}
}
return r;
}
int main()
{
fin >> n;
int i = 0, ex, last_position;
while(fin >> v[i])
{
sequence[i] = 0;
parent[i] = -1;
i++;
}
int pos;
for (i = 1; i < n; i++)
{
if (v[i] < v[sequence[0]])
{
sequence[0] = i;
}
else if (v[i] > v[sequence[lmax]])
{
parent[i] = sequence[lmax];
lmax++;
sequence[lmax] = i;
last_position = i;
}
else
{
pos = find_best_j(v[i]);
parent[i] = sequence[pos - 1];
sequence[pos] = i;
}
}
int copie = lmax;
fout << lmax + 1 << endl;
while (parent[last_position] != -1)
{
solutii[copie] = v[last_position];
last_position = parent[last_position];
copie--;
}
solutii[copie] = v[last_position];
for (i = 0; i <= lmax; i++)
{
fout << solutii[i] << ' ';
}
fout << endl;
return 0;
}
/*#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("sclm.in");
ofstream fout("sclm.out");
vector <int> sequence;
stack <int> rasp;
int n, lmax;
int v[100005];
int parent[100005];
int caut_bin(int elem)
{
int st = 0, dr = sequence.size() - 1, m;
while (st < dr)
m = (st + dr) >> 1,(sequence[m] < elem) ? st = ++m : dr = m;
return st;
}
int main()
{
fin >> n;
int i = 0, ex;
while(fin >> v[i++]);
int pos;
sequence.push_back(0);
lmax = 1;
for (i = 1; i < n; i++)
{
ex = sequence.back();
if (v[i] < v[sequence[0]])
{
sequence[0] = i;
}
else if (v[i] > v[ex])
{
//cout << " ba " << v[i] << endl;
//parent[i] = parent[ex];
parent[i] = sequence[lmax - 1];
sequence.push_back(i);
lmax++;
}
else
{
pos = caut_bin(v[i]);
// if(v[pos] != v[i])
parent[i] = sequence[pos - 1];
sequence[pos] = i;
//else
//{
// while (sequence[pos] == v[i])
// {
// pos++;
//}
//sequence[pos] = i;
//parent[i] = sequence[pos - 1];
//parent[i] = parent[pos] + 1;
//}
//cout << v[i] << " pus pe " << pos << " si " << v[sequence[pos - 1]] << " cu " << v[sequence[pos]] << endl;
}
}
//fout << sequence.size();
fout << lmax << endl;
//rasp.push(sequence.back() + 1);
//cout << sequence.size() << " " << sequence.back();
rasp.push(v[sequence.back()]);
lmax--;
while (lmax > 0)
{
i = parent[sequence.back()];
//rasp.push(i + 1);
rasp.push(v[i]);
sequence.pop_back();
lmax--;
}
while (!rasp.empty())
{
fout << rasp.top() << " ";
rasp.pop();
}
// for (i = 0 ; i < sequence.size(); i++)
// {
//cout << v[sequence[i]] << " ";
// }
return 0;
}
*/ /*
#include <bits/stdc++.h>
using namespace std;
const int max_n = 100000;
int n;
vector<int> v(max_n);
vector<int> before(max_n);
vector<int> tail(max_n);
vector<int> solution(max_n);
int length, last_position;
int find_best_j(int value) {
int l = -1;
int r = length;
int m;
while (l + 1 < r) {
m = l + (r - l) / 2;
if (v[tail[m]] < value) {
l = m;
} else {
r = m;
}
}
return r;
}
int main() {
freopen("sclm.in", "r", stdin);
freopen("sclm.out", "w", stdout);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> v[i];
tail[i] = 0;
before[i] = -1;
}
for (int i = 1; i < n; i++) {
if (v[i] < v[tail[0]]) {
tail[0] = i;
} else if (v[i] > v[tail[length]]) {
tail[++length] = i;
before[i] = tail[length - 1];
last_position = i;
cout << i << " plu " << v[i] << endl;
//cout << v[i] << endl;
} else {
int pos = find_best_j(v[i]);
tail[pos] = i;
before[i] = tail[pos - 1];
}
}
cout << length + 1 << "\n";
cout << tail[0] << " si " << tail[length] << " " << before[length] << endl << endl;
cout << v[tail[0]] << " si " << v[tail[length]] << " " << v[before[length]] << endl << endl;
cout << last_position << " ssss" << v[last_position] << endl;
int solution_length = length + 1;
while (before[last_position] != -1)
{
solution[length--] = v[last_position];
last_position = before[last_position];
}
solution[0] = v[last_position];
for (int i = 0; i < solution_length; i++)
{
cout << solution[i] << " ";
}
cout << "\n";
return 0;
}
*/