Cod sursa(job #1235466)

Utilizator stanescumalinStanescu Malin Octavian stanescumalin Data 29 septembrie 2014 20:14:26
Problema Partitie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#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;
}