Cod sursa(job #3142037)

Utilizator lazureanrLazurean Razvan lazureanr Data 18 iulie 2023 15:03:04
Problema Partitie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("partitie.in");
ofstream fout("partitie.out");
struct vec
{
    int el,poz;
}a[300001];
void quicksort(vec v[], int st, int dr)
{
	if(st < dr)
	{
		//pivotul este inițial v[st]
		int m = (st + dr) / 2;
		vec aux = v[st];
		v[st] = v[m];
		v[m] = aux;
		int i = st , j = dr, d = 0;
		while(i < j)
		{
			if(v[i].el > v[j].el)
			{
				aux = v[i];
				v[i] = v[j];
				v[j] = aux;
				d = 1 - d;
			}
			i += d;
			j -= 1 - d;
		}
		quicksort(v, st , i - 1);
		quicksort(v, i + 1 , dr);
	}
}
int nr=0;
int n,d;
int sol[300001];
int main()
{
    fin>>n>>d;
    for(int i=1; i<=n; i++)
    {
        fin>>a[i].el;
        a[i].poz=i;
    }
    quicksort(a,1,n);
    int j=2;
    for(int i=1; i<=n; i++)
    {
        if(sol[a[i].poz]==0)
        {
            sol[a[i].poz]=++nr;
        }
        while(j<=n && (sol[a[j].poz]||a[j].el<a[i].el+d))
        {
            j++;
        }
        if(j<=n)
        {
            sol[a[j].poz]=sol[a[i].poz];
        }
        /*for(int j=i+1; j<=n; j++)
        {
            if(a[i]+d<=a[j] && sol[j]==0)
            {
                cout<<a[i]<<" "<<a[j]<<endl;
                sol[j]=sol[i];
                break;
            }
        }*/
    }
    fout<<nr<<'\n';
    for(int i=1; i<=n; i++)
    {
        fout<<sol[i]<<'\n';
    }
    return 0;
}