Pagini recente » Cod sursa (job #2114671) | Cod sursa (job #1371826) | Cod sursa (job #286601) | Cod sursa (job #2089825) | Cod sursa (job #886679)
Cod sursa(job #886679)
#include <stdio.h>
FILE *fin = fopen("scmax.in", "r");
FILE *fout = fopen("scmax.out", "w");
// lucram cu 2 vectori. BST[i] = cel mai mic element cu care se poate termina un subsir de lungime i.
// POZ[i] = pozitia pe care este plasat a[i] in BST
// Initial, BST este gol. Parcurgem vectorul a. La pasul i:
// Caut binar cel mai mic element din BST care e mai mare decat a[i].
// Daca l-am gasit, inlocuiesc elemnentul respectiv cu a[i], altfel il punem la sfarsitul lui BST[i]
// In ambele cazuri, retinem in poz si pozitia pe care a fost plasat a[i]
// La final, lg vectorului BST va fi de fapt egala cu lungimea celui mai lung subsir crescator
// Pentru a reconstitui subsirul utilizam pozitiile din poz.
// -parcurg vectorul poz de la dr la st. La fiecare pas identific poz
long long a[100000],n,i,bst[100000],poz[100000], lgbst, pozitie, max, pozmax;
using namespace std;
int caut_binar(int p, int u, int x)
{
int m;
int maxX = -1;
while(p<=u){
m = (p+u)/2;
if(bst[m] >= x)
{
maxX = m;
u = m-1;
}
else
{
p=m+1;
}
}
return maxX;
}
int main()
{
fscanf(fin,"%d", &n);
for(i=1; i<=n; i++)
fscanf(fin, "%d", &a[i]);
bst[1] = a[1];
poz[1] = 1;
lgbst = 1;
for(i=2; i<=n; i++)
{
pozitie = caut_binar(1, lgbst, a[i]);
if(pozitie > -1)
{
bst[pozitie] = a[i];
poz[i] = pozitie;
if(poz[i] > max){
max = poz[i];
pozmax = i;
}
}
else
{
bst[++lgbst] = a[i];
poz[i] = lgbst;
if(poz[i] > max){
max = poz[i];
pozmax = i;
}
}
}
fprintf(fout, "%d\n", lgbst);
for(i=1; i<= lgbst; i++)
fprintf(fout, "%d ", bst[i]);
}