Cod sursa(job #2286264)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 19 noiembrie 2018 23:23:03
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

int v[10001];
int predst[10001], pozminst[10001], lst[10001];
int preddr[10001], pozmindr[10001], ldr[10001];

int cautBinSt( int n, int nr ) {
    int r = 1, pas = 1 << 13;
    while ( pas != 0 ) {
        if ( r + pas <= n && v[pozminst[r + pas]] < nr )
            r += pas;
        pas /= 2;
    }
    return r;
}

int cautBindr( int n, int nr ) {
    int r = 1, pas = 1 << 13;
    while ( pas != 0 ) {
        if ( r + pas <= n && v[pozmindr[r + pas]] < nr )
            r += pas;
        pas /= 2;
    }
    return r;
}

int main() {
    FILE *fin, *fout;
    int n, i, j, m1, m2, max;
    double nr;
    fin = fopen( "euro2.in", "r" );
    fout = fopen( "euro2.out", "w" );
    fscanf( fin, "%d", &n );
    m1 = 1;
    for ( i = 1; i <= n; i++ ) {
        fscanf( fin, "%lf", &nr );
        nr *= 10000.0;
        v[i] = nr;
        j = cautBinSt( m1, v[i] );
        predst[i] = pozminst[j];
        lst[i] = lst[predst[i]] + 1;
        pozminst[j + 1] = i;
        if ( j == m1 )
            m1++;
    }
    m2 = 1;
    for ( i = n; i >= 1; i-- ) {
        j = cautBindr( m2, v[i] );
        preddr[i] = pozmindr[j];
        ldr[i] = ldr[preddr[i]] + 1;
        pozmindr[j + 1] = i;
        if ( j == m2 )
            m2++;
    }
    max = 0;
    for ( i = 1; i <= n; i++ )
        if ( lst[i] + ldr[i] > max && lst[i] > 1 && ldr[i] > 1 )
            max = lst[i] + ldr[i];
    fprintf( fout, "%d", max - 1 );
    fclose( fin );
    fclose( fout );
    return 0;
}