Pagini recente » Cod sursa (job #902933) | Cod sursa (job #697030) | Cod sursa (job #1845817) | Cod sursa (job #2488972) | Cod sursa (job #2415574)
#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;
}