Cod sursa(job #2406578)

Utilizator TeoDiDiaconescu Teodora TeoDi Data 15 aprilie 2019 21:40:10
Problema Partitie Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>
#include <set>
#define Nax 300001
int n,d;

std::pair<int,int>v[Nax];
int poz[Nax];
int f[Nax][2];
int nax;
using namespace std;
ifstream fin("partitie.in");
ofstream fout("partitie.out");
void part(int st,int dr, int &stst, int &stdr, int &drst, int &drdr)
    {
         int i, j;
         pair <int,int> piv,aux;
         piv = v[(st+dr)/2];
         i = st - 1; j = dr + 1;
         while (i < j) {
            do {i++;} while (v[i].first < piv.first);
            do {j--;} while (v[j].first > piv.first);
            if (i < j)
            {
                aux = v[i]; v[i] = v[j]; v[j] = aux;
            }
         }
         stst = st; drdr = dr;
         if (i==j) { stdr = j - 1; drst = i + 1; }
             else { stdr = j; drst = i; }
    }

    void Sort(int st, int dr)
    {
         int stst, stdr, drst, drdr;
         if (st<dr)
         {
             part(st,dr,stst,stdr,drst,drdr);
             Sort(stst,stdr);
             Sort(drst,drdr);
         }
    }
int main()
{
    fin>>n>>d;
    for(int i=1;i<=n;i++) {fin>>v[i].first; v[i].second=i;}
    Sort(1,n);
    f[1][0]=1;
    f[1][1]=1;
    poz[v[1].second]=1;
    nax=1;
    for(int i=2;i<=n;i++)
    {
        bool ok=0;
        for(int j=1;j<=nax && !ok;j++)
        {
            if(v[i].first-v[f[j][1]].first>=d)
            {
                ok=1;
                f[j][0]++;
                f[j][1]=i;
                poz[v[i].second]=j;
            }
        }
        if(!ok)
        {
            nax++;
            f[nax][0]=1;
            f[nax][1]=i;
            poz[v[i].second]=nax;
        }
    }
    fout<<nax<<'\n';
    for(int i=1;i<=n;i++)
        fout<<poz[i]<<'\n';
    return 0;
}