Cod sursa(job #374178)

Utilizator titusuTitus C titusu Data 16 decembrie 2009 11:26:48
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
using namespace std;
#include <fstream>
#include <iostream>
#include <algorithm>
#define NN 300010
int a[NN],poz[NN],part[NN],n,nrp,d,heap[NN];




bool MaiMic(int i,int j){
	return a[i]<a[j];
}

void Cerne(int k){
	int esteheap=0,i, aux;
	while(!esteheap && 2*k<=nrp){
		i=2*k;
		if(i<nrp && a[heap[i]] > a[heap[i+1]])
			i++;
		if(a[heap[k]]<=a[heap[i]])
			esteheap=1;
		else{
			aux=heap[i]; heap[i]=heap[k];heap[k]=aux;
			k=i;
		}
	}
}

void Proceseaza(int poz){
	//prelucrez elementul de pe pozitia poz din a;
	if(nrp==0){
		nrp++;
		heap[nrp]=poz;
		part[poz]=nrp;
	}
	else
		if(a[poz]-a[heap[1]]>=d){
			part[poz]=part[heap[1]];
			heap[1]=poz;
			Cerne(1);
		}
		else
		{
			nrp++;
			part[poz]=nrp;
			heap[nrp]=poz;
		}
}

int main(){
	ifstream fin("partitie.in");
	fin>>n>>d;
	for(int i=1;i<=n;i++)
		fin>>a[i],poz[i]=i;
	sort(poz+1,poz+n+1,MaiMic);
	//for(int i=1;i<=n;i++)
	//	cout<<poz[i]<<" ";
	for(int i=1;i<=n;i++){
		Proceseaza(poz[i]);
	}
	ofstream fout("partitie.out");
	fout<<nrp<<endl;
	for(int i=1;i<=n; ++i)
		fout<<part[i]<<"\n";
	return 0;
}