Pagini recente » Cod sursa (job #1664499) | Cod sursa (job #2104330) | Cod sursa (job #128772) | Cod sursa (job #1273551) | Cod sursa (job #1235466)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct
{
int number;
int position;
int m;
} nppair;
typedef struct
{
void* n;
void* p;
int l;
int no;
} ring;
bool cmp(nppair a, nppair b) { return (a.number<b.number); }
bool cmpp(nppair a, nppair b) { return (a.position<b.position); }
void* ringpp(ring** rp)
{
*rp = ((ring*)(*rp)->n);
}
void ins_ring(ring* e_p, ring* rg)
{
ring* pc = (ring*)rg->p;
pc->n = e_p; rg->p = e_p;
e_p->p = pc; e_p->n = rg;
}
int main()
{
int i, l, d;
int a, ki, kpi;
ifstream fin("partitie.in");
fin>>l;
fin>>d;
nppair* kin = new nppair[l];
for(i=0; i<l; i++)
{
fin>>a;
kin[i].number = a;
kin[i].position = i;
}
vector<nppair> vn (kin, kin+l);
delete[] kin;
sort(vn.begin(), vn.end(), cmp);
ring* r, *p;
ki=1;
p = new ring[1]; p->n = p; p->p = p; p->l = vn[0].number; p->no = ki; ki++;
r = p;
vn[0].m = r->no;
for(i=1; i<l; i++)
{
if(vn[i].number >= r->l+d)
{
vn[i].m = r->no;
r->l = vn[i].number;
ringpp(&r);
}
else
{
p = new ring[1];
p->no = ki; ki++; p->l = vn[i].number;
vn[i].m = p->no;
ins_ring(p, r);
}
}
/*for(i=0; i<l; i++)
{
cout<<vn[i].number<<" "<<vn[i].position<<" "<<vn[i].m<<"\n";
}*/
ofstream fout("partitie.out");
fout<<ki-1<<"\n";
int* kon = new int[l];
for(i=0; i<l; i++) kon[vn[i].position] = vn[i].m;
for(i=0; i<l; i++) fout<<kon[i]<<"\n";
return 0;
}