Cod sursa(job #961221)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 19:48:23
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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;
}