Cod sursa(job #125093)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 20 ianuarie 2008 11:21:05
Problema Partitie Scor 70
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 2.38 kb
#include <fstream>
std::ifstream f1("partitie.in");
std::ofstream f2("partitie.out");
struct e {long elem, poz, part;};

long part(struct e sir[300000], long jos, long sus);
void quicksort(struct e sir[300000], long jos, long sus);
long bsearch(struct e sir[300000], long jos, long sus, long nr);
long part2(struct e sir[300000], long jos, long sus);
void quicksort2(struct e sir[300000], long jos, long sus);

struct e m[300000];
int main()
{
	long n, d, i, max, poz;
	f1>>n>>d;
	for (i=0; i<n; i++)
	{
		f1>>m[i].elem;
		m[i].poz=i;
		m[i].part=0;
	}//for i
	quicksort(m, 0, n-1);
	max=0;
	for (i=0; i<n; i++)
	{
		if (m[i].part==0)
		  m[i].part=++max;
		if ((m[i].elem+d)<=m[n-1].elem)
		{
			poz=bsearch(m, 0, n, m[i].elem+d);
			while (((m[poz].part>0)||(m[poz].elem<(m[i].elem+d)))&&(poz<n))
				poz++;
			if (poz<n)
				m[poz].part=m[i].part;
		}//if
	}//for i
	quicksort2(m, 0, n-1);
	f2<<max<<"\n";
	for (i=0; i<n; i++)
		f2<<m[i].part<<"\n";
	f1.close();
	f2.close();
	return 0;
}//main

long part(struct e sir[300000], long jos, long sus)
{
	long p, q;
	struct e temp;
	p=jos;
	q=sus;
	while (p<q)
	{
		while ((sir[p].elem<=sir[jos].elem)&&(p<=q))
			p++;
		while ((sir[q].elem>sir[jos].elem)&&(q>=p))
			q--;
		if (p<q)
		{
			temp=sir[p];
			sir[p]=sir[q];
			sir[q]=temp;
		}//if
	}//while
	temp=sir[q];
	sir[q]=sir[jos];
	sir[jos]=temp;
	return q;
}//part

void quicksort(struct e sir[300000], long jos, long sus)
{
	if (jos<sus)
	{
		long p=part(sir, jos, sus);
		quicksort(sir, jos, p-1);
		quicksort(sir, p+1, sus);
	}//if
}//quicksort

long bsearch(struct e sir[300000], long jos, long sus, long nr)
{
	int mij=(jos+sus)/2;
	while ((jos<=sus)&&(sir[mij].elem!=nr))
	{
		mij=(jos+sus)/2;
		if (sir[mij].elem<nr)
		  jos=mij+1;
	  else
			if (sir[mij].elem>nr)
	  		sus=mij-1;
	}//while
	if (sir[mij].elem==nr)
  	return mij;
	else
		return mij;
}//bsearch

long part2(struct e sir[300000], long jos, long sus)
{
	long p, q;
	struct e temp;
	p=jos;
	q=sus;
	while (p<q)
	{
		while ((sir[p].poz<=sir[jos].poz)&&(p<=q))
			p++;
		while ((sir[q].poz>sir[jos].poz)&&(q>=p))
			q--;
		if (p<q)
		{
			temp=sir[p];
			sir[p]=sir[q];
			sir[q]=temp;
		}//if
	}//while
	temp=sir[q];
	sir[q]=sir[jos];
	sir[jos]=temp;
	return q;
}//part2

void quicksort2(struct e sir[300000], long jos, long sus)
{
	if (jos<sus)
	{
		long p=part2(sir, jos, sus);
		quicksort2(sir, jos, p-1);
		quicksort2(sir, p+1, sus);
	}//if
}//quicksort2