Cod sursa(job #374980)

Utilizator loginLogin Iustin Anca login Data 18 decembrie 2009 23:06:48
Problema Partitie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
# include <fstream>
# include <algorithm>
using namespace std;
int n, d, v[300003], h[300003], nh, poz[300003], p[300003];

bool mai_mic(int i, int j)
{
	if (v[i]<=v[j])return 1;
	return 0;
}

void cerne (int k)
{
	int i, eh=0;
	while (!eh && 2*k<=nh)
	{
		i=2*k;
		if (i+1<=nh && h[i+1]<h[i])
			i=i+1;
		if (h[k]<=h[i])
			eh=1;
		else
		{
			int a;
			a=h[k], h[k]=h[i], h[i]=a;
			a=p[k], p[k]=p[i], p[i]=a;
			k=i;
		}
	}
}

void promoveaza (int k)
{
	int eh=0;
	while (!eh && k/2)
		if (h[k/2]<=h[k])
			eh=1;
		else
		{
			int a;
			a=h[k], h[k]=h[k/2], h[k/2]=a;
			a=p[k], p[k]=p[k/2], p[k/2]=a;
			k=k/2;
		}
}


int main ()
{
	int i;
	ifstream fin ("partitie.in");
	ofstream fout ("partitie.out");
	fin>>n>>d;
	for (i=1;i<=n;i++)
		fin>>v[i], poz[i]=i;
	sort(poz+1, poz+n+1, mai_mic);
	h[++nh]=v[poz[1]];
	p[nh]=nh;
	v[poz[1]]=nh;
	for (i=2;i<=n;i++)
		if (v[poz[i]]-h[1]>=d)
		{
			h[1]=v[poz[i]];
			v[poz[i]]=p[1];
			cerne(1);
		}
		else
		{
			h[++nh]=v[poz[i]];
			p[nh]=nh;
			v[poz[i]]=nh;
			promoveaza(nh);
		}
	fout<<nh<<endl;
	for (i=1;i<=n;i++)
		fout<<v[i]<<endl;
	return 0;
}