Cod sursa(job #2501243)

Utilizator FrostfireMagirescu Tudor Frostfire Data 29 noiembrie 2019 11:47:56
Problema Partitie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <queue>
#define NMAX 300000

using namespace std;

ifstream f("partitie.in");
ofstream g("partitie.out");

int m, n, d, a[NMAX+100], sol[NMAX+100], nrgrupe;
pair <int, int> v[NMAX+100];
priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > pq;

int main()
{
    f >> n >> d;
    for(int i=1; i<=n; i++)
        {   f >> v[i].first;
            v[i].second = i;
        }
    sort(v+1, v+n+1);
    if(n < 1500)
        {   a[1] = v[1].first;
            m = 1;
            sol[v[1].second] = 1;
            for(int i=2; i<=n; i++)
                {   int val = v[i].first - d, maxi = 0, p = 0;
                    for(int j=1; j<=m; j++)
                        if(a[j] <= val && a[j] > maxi) maxi = a[j], p = j;
                    if(!maxi)
                        {   m++;
                            a[m] = v[i].first;
                            sol[v[i].second] = m;
                        }
                    else
                        {   a[p] = v[i].first;
                            sol[v[i].second] = p;
                        }
                }
            g << m << '\n';
            for(int i=1; i<=n; i++) g << sol[i] << '\n';
            return 0;
        }
    nrgrupe = 1;
    pq.push(make_pair(v[1].first, 1));
    sol[v[1].second] = 1;
    for(int i=2; i<=n; i++)
        {   pair <int, int> el = pq.top();
            int val = v[i].first - d;
            if(el.first <= val)
                {   pq.pop();
                    sol[v[i].second] = el.second;
                    pq.push(make_pair(v[i].first, el.second));
                }
            else
                {   nrgrupe++;
                    sol[v[i].second] = nrgrupe;
                    pq.push(make_pair(v[i].first, nrgrupe));
                }
        }
    g << nrgrupe << '\n';
    for(int i=1; i<=n; i++) g << sol[i] << '\n';
    return 0;
}