Cod sursa(job #2415574)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 26 aprilie 2019 11:45:34
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>
#define maxn 100000
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

struct yes
{
  vector <int> v;
};

yes aint[4*maxn+5];
int u[maxn+5];

inline int gsize ( int sz2, pii sol )
{
  return sol.fi+1 + (sz2-sol.se+1);
}

bool cmp ( int p, vector<int> a, vector<int> b ) /// 1 pt b mai bun decat a, 0 altfel
{
  if ( a.size() > b.size() ) return 0;
  else if ( a.size() < b.size() ) return 1;
  int i, sz = a.size();
  if ( p%2 == 0 )
  {
    i = sz-1;
    while ( i >= 0 && a[i] == b[i] ) i--;
    if ( i < 0 || a[i] <= b[i] ) return 0;
    return 1;
  }
  i = 0;
  while ( i < sz && a[i] == b[i] ) i++;
  if ( i >= sz || a[i] >= b[i] ) return 0;
  return 1;
}

void build ( int p, pii itv )
{
  if ( itv.fi == itv.se ) { aint[p].v.pb (u[itv.fi]); return; }
  int mid = (itv.fi + itv.se) / 2;
  build (p*2, {itv.fi,mid});
  build (p*2+1, {mid+1,itv.se});
  int sz1 = aint[p*2].v.size(), sz2 = aint[p*2+1].v.size();
  int i1 = 0, i2 = 0, mod = 0;
  aint[p].v = aint[p*2].v;
  pii sol = make_pair (sz1,sz2);
  if ( cmp (p, aint[p].v, aint[p*2+1].v) == 1 ) aint[p].v = aint[p*2+1].v, sol = {-1,0};

  for ( ; i1 < sz1; i1++ )
  {
    while ( i2 < sz2 && aint[p*2+1].v[i2] <= aint[p*2].v[i1] ) i2++;
    if ( gsize (sz2, sol) < gsize (sz2, {i1,i2}) ) sol = {i1,i2}, mod = 1;
  }
  if ( mod == 1 )
  {
    aint[p].v.clear();
    int i;
    for ( i = 0; i <= sol.fi; i++ ) aint[p].v.pb (aint[p*2].v[i]);
    for ( i = sol.se; i < sz2; i++ ) aint[p].v.pb (aint[p*2+1].v[i]);
  }
}

int main ()
{
  ifstream fin ( "scmax.in" );
  ofstream fout ( "scmax.out" );

  int n; fin >> n;
  int i;
  for ( i = 1; i <= n; i++ ) fin >> u[i];
  build (1,{1,n});

  int sz = aint[1].v.size();
  fout << sz << '\n';
  for ( i = 0; i < sz; i++ ) fout << aint[1].v[i] << ' ';

  fin.close ();
  fout.close ();

  return 0;
}