Cod sursa(job #2658532)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 14 octombrie 2020 11:07:46
Problema Partitie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define nl '\n'
using namespace std;
ifstream f ( "partitie.in" );
ofstream g ( "partitie.out" );
struct elem
{
    int val, index;
};
struct comparare
{
    bool operator() ( const elem &a, const elem &b )
    {
        if ( a.val == b.val )
            return a.index < b.index;

        return a.val < b.val;
    }
};
bool cmp ( elem a, elem b )
{
    return a.val < b.val;
}
elem v[300001];
int ans[300001], nrp;
set<elem, comparare>s;
set<elem>::iterator it;
int main()
{
    int N, D;
    f >> N >> D;

    for ( int i = 1; i <= N; i++ )
    {
        v[i].index = i;
        f >> v[i].val;
    }

    sort ( v + 1, v + N + 1, cmp );

    for ( int i = 1; i <= N; i++ )
    {
        int val = v[i].val - D;

        if ( !s.empty() )
            it = s.begin();
        else
        {
            nrp = 1;
            ans[v[i].index] = 1;
            s.insert ( {v[i].val, 1} );
            continue;
        }

        if ( it->val <= v[i].val - D )
        {
            ans[v[i].index] = it->index;
            int nr = it->index;
            s.erase ( it );
            s.insert ( {v[i].val, nr} );

        }
        else
        {
            nrp++;
            ans[v[i].index] = nrp;
            s.insert ( {v[i].val, nrp} );
        }
    }

    g << nrp << nl;

    for ( int i = 1; i <= N; i++ )
        g << ans[i] << nl;

    return 0;
}