Mai intai trebuie sa te autentifici.
Cod sursa(job #2014064)
Utilizator | Data | 22 august 2017 20:27:02 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.42 kb |
#include<cstdio>
#define MAX_N 100000
using namespace std;
FILE *fout = fopen("scmax.out","w");
int v[MAX_N], T[MAX_N], R[MAX_N], n, len;
void Read()
{
FILE *fin = fopen("scmax.in","r");
fscanf(fin,"%d",&n);
for(int i=0; i<n; i++)
{
fscanf(fin,"%d",&v[i]);
R[i] = -1;
}
fclose(fin);
}
int binarySearch(int End, int val)
{
int left, right, mid;
left = 0; right = End;
while(left <= right)
{
mid = (left + right) >> 1;
if(v[T[mid]] < val && val <= v[T[mid+1]])
return mid + 1;
else if(v[T[mid]] > val)
right = mid - 1;
else left = mid + 1;
}
return -1;
}
void longestIncreasingSubsequence()
{
int index, i;
for(i=1; i<n; i++)
{
if(v[i] > v[T[len]])
{
len++;
T[len] = i;
R[T[len]] = T[len-1];
}
else if(v[i] < v[T[0]])
T[0] = i;
else
{
index = binarySearch(len,v[i]);
T[index] = i;
R[T[index]] = T[index-1];
}
}
}
void printSol(int x)
{
if(x != -1)
{
printSol(R[x]);
fprintf(fout,"%d ",v[x]);
}
}
int main()
{
Read();
longestIncreasingSubsequence();
fprintf(fout,"%d\n",len+1);
printSol(T[len]);
fprintf(fout,"\n");
fclose(fout);
return 0;
}