Pagini recente » Cod sursa (job #306600) | Cod sursa (job #151400) | Cod sursa (job #750668) | Cod sursa (job #1111725) | Cod sursa (job #2950697)
#include <stdio.h>
#include <map>
#include <algorithm>
using namespace std;
#define NMax 100005
FILE *in = fopen("scmax.in", "r"), *out = fopen("scmax.out", "w");
int N;
int a[NMax], comp[NMax], BIT[NMax] = {0};
int query(int index){
int ML = 0, i = index;
while (i > 0){
if (BIT[i] > ML)
ML = BIT[i];
i = i - (i & (-i));
}
return ML;
}
int main()
{
// Read array
fscanf(in, "%d", &N);
for (int i = 1; i <= N; ++i){
fscanf(in, "%d", &a[i]);
comp[i] = a[i];
}
// Coordinate compression
sort(comp + 1, comp + N + 1);
map<int, int> comp_mapping;
int j = 1;
for (int i = 1; i <= N; ++i){
if(i >= 2 && comp[i] == comp[i-1])
continue;
comp_mapping[comp[i]] = j;
++j;
}
for (int i = 1; i <= N; ++i){
comp[i] = comp_mapping[a[i]];
}
// Construct BIT of max lengths
int max_length;
for (int i = 1; i <= N; ++i){
// Get max length up until now (?)
max_length = query(comp[i] - 1);
// Update nodes of BIT
j = comp[i];
while(j <= N){
BIT[j] = max(BIT[j], max_length + 1);
j = j + (j & (-j));
}
}
// Get max increasing subsequence length
max_length = 0;
for (int i = 1; i <= N; ++i){
if (BIT[i] > max_length)
max_length = BIT[i];
}
fprintf(out, "%d\n", max_length);
// Get one such subsequence
return 0;
}