Pagini recente » Borderou de evaluare (job #1586019) | Cod sursa (job #2651476) | Cod sursa (job #3238721) | Borderou de evaluare (job #3274706) | Cod sursa (job #2501210)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <queue>
#define NMAX 300000
using namespace std;
ifstream f("partitie.in");
ofstream g("partitie.out");
int m, n, d, a[NMAX+100], sol[NMAX+100], nrgrupe;
pair <int, int> v[NMAX+100];
priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > pq;
int main()
{
f >> n >> d;
for(int i=1; i<=n; i++)
{ f >> v[i].first;
v[i].second = i;
}
sort(v+1, v+n+1);
if(n < 1500)
{ a[1] = v[1].first;
m = 1;
sol[v[1].second] = 1;
for(int i=2; i<=n; i++)
{ int val = v[i].first - d, maxi = 0, p = 0;
for(int j=1; j<=m; j++)
if(a[j] <= val && a[j] > maxi) maxi = a[j], p = j;
if(!maxi)
{ m++;
a[m] = v[i].first;
sol[v[i].second] = m;
}
else
{ a[p] = v[i].first;
sol[v[i].second] = p;
}
}
g << m << '\n';
for(int i=1; i<=n; i++) g << sol[i] << '\n';
return 0;
}
nrgrupe = 1;
pq.push(make_pair(v[1].first, 1));
sol[v[1].second] = 1;
for(int i=2; i<=n; i++)
{ pair <int, int> el = pq.top();
int val = v[i].first - d;
if(el.first <= val)
{ pq.pop();
sol[v[i].second] = el.second;
pq.push(make_pair(v[i].first, el.second));
}
else
{ nrgrupe++;
sol[v[i].second] = nrgrupe;
pq.push(make_pair(v[i].first, nrgrupe));
}
}
g << nrgrupe << '\n';
for(int i=1; i<=n; i++) g << sol[i] << '\n';
return 0;
}