Pagini recente » Cod sursa (job #2675480) | Cod sursa (job #349161) | Cod sursa (job #28925) | Planificare infoarena | Cod sursa (job #1235274)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
int N, D;
pair <int, int> v[300111];
int lol[300111];
int done[300111];
void Citire ()
{
ifstream fin ("partitie.in");
fin >> N >> D;
for (int i = 0; i < N; i++)
fin >> v[i].first, v[i].second = i;
fin.close ();
}
int Precalc ()
{
sort (v, v + N);
int j = N - 1;
memset (lol, -1, sizeof (lol));
for (int i = N - 1; i >= 0; i--)
{
for (; j >= 0; j--)
if ((v[i].first - v[j].first) >= D)
{
lol[i] = j;
break;
}
}
}
int Business ()
{
int cnt = 0;
for (int i = N - 1; i >= 0; i--)
if (!done[v[i].second])
{
done[v[i].second] = ++cnt;
int point = i;
while (point >= 0)
{
point = lol[point];
done[v[point].second] = cnt;
}
}
return cnt;
}
void Scriere ()
{
ofstream fout ("partitie.out");
fout << Business ();
for (int i = 0; i < N; i++)
fout << "\n" << done[i];
fout.close ();
}
int main ()
{
Citire ();
Precalc ();
Scriere ();
return 0;
}