Mai intai trebuie sa te autentifici.
Cod sursa(job #2969226)
| Utilizator | Data | 22 ianuarie 2023 19:00:49 | |
|---|---|---|---|
| Problema | Subsir crescator maximal | Scor | 5 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 2.11 kb |
/*
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
#define MAX_n 100000
int v[MAX_n], pred[MAX_n], s[MAX_n];
int cautabin (int st, int dr, int a) // 0 1 15
{
int pas = (1 << 16), ac = st - 1;
while(pas)
{
if(ac + pas <= dr)
{
//cout << pas << " ";
if(v[s[ac + pas]] < a)
{
ac += pas;
}
}
pas >>= 1;
}
//cout << ac;
return ac;
}
void scrie(int poz)
{
if(poz != 1)
{
scrie(pred[poz]);
fout << v[poz];
}
}
int main()
{
int n, ans = 0;
fin >> n;
for(int i = 0; i < n; ++i)
{
fin >> v[i];
int lung = cautabin(0, ans - 1, v[i]) + 1;
s[lung] = i;
s[lung] = i; // s[1] = 1
if(lung > 0)
pred[i] = s[lung - 1];
else
pred[i] = -1;
ans = max(ans, lung + 1);
}
fout << ans << '\n';
scrie(s[ans - 1]);
}
*/
#include <fstream>
#define MAX_N 100000
using namespace std;
int v[MAX_N], s[MAX_N], pred[MAX_N];
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int cautabin (int st, int dr, int a) // 0 1 15
{
int pas = (1 << 16), ac = st - 1;
while(pas)
{
if(ac + pas <= dr)
{
//cout << pas << " ";
if(v[s[ac + pas]] < a)
{
ac += pas;
}
}
pas >>= 1;
}
//cout << ac;
return ac;
}
void scrie(int poz)
{
if(poz != 1)
{
scrie(pred[poz]);
fout << v[poz];
}
}
int main()
{
int n, ans = 0;
fin >> n;
for(int i = 0; i < n; ++i)
{
fin >> v[i];
int lung = cautabin(0, ans - 1, v[i]) + 1;
s[lung] = i;
s[lung] = i; // s[1] = 1
if(lung > 0)
pred[i] = s[lung - 1];
else
pred[i] = -1;
ans = max(ans, lung + 1);
}
fout << ans << '\n';
scrie(s[ans - 1]);
}
