Pagini recente » Cod sursa (job #3036803) | Cod sursa (job #2476436) | Cod sursa (job #3246193) | Cod sursa (job #2039960) | Cod sursa (job #125262)
Cod sursa(job #125262)
#include <stdio.h>
#include <set>
#include <algorithm>
using namespace std;
const int n_max = 300010;
set <int > s;
set <int > v;
set <int >::iterator it;
int a[n_max],
b[n_max],
ind[n_max];
int i, n, d, p, maxim, test;
bool cmp(const int x, const int y)
{
return a[x]<a[y];
}
int main()
{
freopen("partitie.in","r",stdin);
freopen("partitie.out","w",stdout);
scanf("%d %d", &n, &d);
for (i = 1; i <= n; ++ i)
{
scanf("%d", &a[i]);
ind[i] = i;
}
sort(ind +1, ind + n + 1, cmp);
p = 1;
b[ind[1]] = 1;
s.insert(1);
maxim = 1;
for (i = 2; i <= n; ++ i)
{
while(a[ind[p]]+d <=a[ind[i]])
{
s.erase(b[ind[p]]);
v.insert(b[ind[p]]);
++p;
}
if (p == i)
{
b[ind[i]] = 1;
s.insert(1);
}
else
{
if (v.size() == 0)
{
it = s.end();
--it;
b[ind[i]] = *it +1;
s.insert(*it +1);
if (b[ind[i]]>maxim)
{
maxim = b[ind[i]];
test = i;
}
}
else
{
it = v.begin();
b[ind[i]] = *it;
s.insert(*it);
v.erase(*it);
}
}
}
printf("%d\n", maxim);
for (i = 1; i <=n; ++ i)
{
printf("%d\n",b[i]);
}
return 0;
}