Cod sursa(job #1525110)

Utilizator kassay_akosKassay Akos kassay_akos Data 14 noiembrie 2015 19:13:40
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define Infinity 30000
typedef int Vector[10001];

Vector V, P, Q, *S;
int N,Len; // Len = lungimea vectorului Q

void ReadData(void) {
    FILE *F=fopen("scmax.in","rt") ;
    int i ;
    fscanf(F,"%d", &N);
    for(i=1;i<=N;i++)
        fscanf(F,"%d",&V[i]);
    fclose(F);
}

int Insert(int K, int Lo, int Hi) {
    int mid = (Lo+Hi)/2;
    if (Lo==Hi) {
        if (Hi>Len) Q[++Len+1]=Infinity;
        Q[Lo]=K;
        return Lo;
    }
    else if (K<Q[mid]) {
     return Insert(K,Lo,mid);
    }
    else return Insert(K,mid+1,Hi);
}

void BuildPQ(void) {
    Len=0;
    Q[1]=Infinity;
    for(int i=1; i<N;i++) {
        P[i]=Insert(V[i],1,Len+1);
    }
}

void BuildS(void){
    int i,K=N;
    for (i=Len;i;i--) {
        while (P[K]!=i) K-- ;
        Q[i] = V[K];                // i use the Q since i have no use for him but i should have use the S-solution
    }
}

void WriteSolution(void) {
    FILE *f=fopen("scmax.out","wt");
    int i;

    fprintf(f,"%d\n",Len);
    for(i=1;i<=Len; i++)
        fprintf(f,"%d",Q[i]);
    fclose(f);
}


void main()
{
    ReadData();
    BuildPQ();
    BuildS();
    WriteSolution();
}