Cod sursa(job #2436896)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 7 iulie 2019 15:43:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
// Matteo Verzotti - C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b

using namespace std;

/*mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

long long rand_seed() {
    long long a = rng();
    return a;
}*/

const int N = 1e5;
int v[N+5],poz[N+5],best[N+5];
vector <int> sol;

void cautbin(int st,int dr,int nr,int i)
{
    int mid;
    while(st <= dr)
    {
        mid = (st + dr) >> 1;
        if(best[mid] >= nr)
            dr = mid - 1;
        else st = mid + 1;
    }
    best[st] = nr;
    poz[i] = st;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,nr,Max=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&nr);
        cautbin(1,Max,nr,i);
        Max=MAX(Max,poz[i]);
        v[i] = nr;
    }
    printf("%d\n",Max);
    for(i=n;i>=1;i--){
        if(poz[i] == Max){
            sol.push_back(v[i]);
            Max--;
        }
    }
    for(i=sol.size()-1;i>=0;i--)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;
}