Cod sursa(job #2153225)

Utilizator trifangrobertRobert Trifan trifangrobert Data 6 martie 2018 01:18:26
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
//#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdlib>
 
using namespace std;
 
const int DIM = 100010;
int aib[DIM];
int n, v[DIM], dp[DIM];
pair <int, int> a[DIM];
pair <int, int> b[DIM];
int elmax = -1;
int Max = -1;
int sol[DIM];
 
void Read()
{
    //ifstream fin("scmax.in");
	FILE *fin = fopen("scmax.in", "r");
    //fin >> n;
	fscanf(fin, "%d", &n);
    for (int i = 1;i <= n;++i)
		fscanf(fin, "%d", &v[i]);
        //fin >> v[i];
	fclose(fin);
    //fin.close();
}
 
void Normalizare()
{
    for (int i = 1;i <= n;++i)
        a[i] = make_pair(v[i], i);
    sort(a + 1, a + n + 1);
    int val = 0;
    a[0].first = -1;
    for (int i = 1;i <= n;++i)
    {
        if (a[i].first != a[i - 1].first)
            b[i] = make_pair(a[i].second, ++val);
        else
            b[i] = make_pair(a[i].second, val);
    }
    elmax = val;
    sort(b + 1, b + n + 1);
}
 
void Update(int pos, int val)
{
    for (int i = pos;i <= elmax;i += (i & (-i)))
        aib[i] = max(aib[i], val);
}
 
int Query(int val)
{
    int ret = 0;
    for (int i = val;i >= 1;i -= (i & (-i)))
        ret = max(ret, aib[i]);
    return ret;
}
 
void Solve()
{
    for (int i = 1;i <= n;++i)
    {
        dp[i] = 1 + Query(b[i].second - 1);
        Update(b[i].second, dp[i]);
    }
 
    int x = -1;
    for (int i = 1;i <= n;++i)
        x = max(x, dp[i]);
    sol[0] = x;
    for (int i = n;i >= 1;--i)
    {
        if (x == dp[i])
        {
            sol[x] = v[i];
            --x;
        }
    }
}
 
void Write()
{
    //ofstream fout("scmax.out");
	FILE * fout = fopen("scmax.out", "w");
    //fout << sol[0] << "\n";
	fprintf(fout, "%d\n", sol[0]);
    for (int i = 1;i <= sol[0];++i)
		fprintf(fout, "%d ", sol[i]);
        //fout << sol[i] << " ";
	fclose(fout);
}
 
int main()
{
    Read();
    Normalizare();
    Solve();
    Write();
    return 0;
}