Cod sursa(job #125361)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 20 ianuarie 2008 12:40:38
Problema Partitie Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.52 kb
#include <set>
#include <algorithm>
#include <cstdio>
using namespace std;
long n,d;
long sol[300002];
struct rec {
        long nr,pz;
       } v[300002];
set<long> a;



bool fcmp( const rec &a, const rec &b){ return (a.nr<b.nr);}


void iofile(void){
        freopen("partitie.in","rt",stdin);
        freopen("partitie.out","wt",stdout);
        scanf("%ld%ld",&n,&d);
        for (int i=1;i<=n;i++){
                scanf("%ld",&v[i]);
                v[i].pz=i;
        }
        sort(v+1,v+n+1,fcmp);
        fclose(stdin);
}


void solve(void){
        long st,dr,mind,ind;
        long min,max,i;
        st=dr=mind=1;
        sol[v[1].pz]=1;
        a.insert(1);
        for (i=2;i<=n;i++){
                dr++;
                while (v[dr].nr-v[st].nr>=d && st<dr){
                        a.erase(a.find(sol[v[st].pz]));
                        st++;
                }
                if (a.empty()){min=0;} else{
                min=(*(a.begin()));         }
                if (a.empty()){max=0;} else {
                {set<long>::iterator fmm=a.end();--fmm;max=*fmm; } }
                if (min<=1){
                        ind=max+1;
                        if (ind>mind){mind=ind;};
                        } else{
                        ind=min-1;}
                sol[v[i].pz]=ind;
                a.insert(ind);
        }
        printf("%ld\n",mind);
        for (i=1;i<=n;i++){
                printf("%ld\n",sol[i]);
        }
        fclose(stdout);
}


int main(void){
        iofile();
        solve();
        return 0;
}