Cod sursa(job #942330)

Utilizator superman_01Avramescu Cristian superman_01 Data 21 aprilie 2013 20:48:39
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb

////////////////
#include<cstdio>
#include<vector>
#include<algorithm>

#define NMAX 300005

FILE *f=fopen("partitie.in","r");
FILE *g=fopen("partitie.out","w");

using namespace std;

struct numb{
int value;
int pos;
};

numb v[NMAX];
int n,Answer,dist;
int sol[NMAX];
bool cmp ( const numb A,const numb B)
{
    if(A.value == B.value)
        return A.pos<B.pos;
    return A.value < B.value;
}

void Read ( void )
{
    fscanf(f,"%d%d",&n,&dist);
    for(int i(1) ; i <= n ; ++i )
    {
        fscanf(f,"%d",&v[i].value);
        v[i].pos=i;
    }
    fclose(f);
}
void Solve ( void )
{
    sort(v+1,v+n+1,cmp);
    int Left,Right;

    for(Left=1 ; Left <= n ; ++Left  )
    {
          if( ! sol[v[Left].pos])
            sol[v[Left].pos]=(++Answer);
          for(; Right<= n && ( sol[v[Right].pos] || v[Right].value-v[Left].value <dist ); )
            ++Right;
           if( ! sol[v[Right].pos])
           sol[v[Right].pos]=sol[v[Left].pos];
    }

}
void Write ( void )
{
    fprintf(g,"%d\n",Answer);
    for( int i(1) ; i <= n ; ++i )
        fprintf(g,"%d\n",sol[i]);
    fclose(g);
}
int main ( void )
{
    Read();
    Solve();
    Write();
    return 0;
}