Cod sursa(job #999987)

Utilizator vendettaSalajan Razvan vendetta Data 21 septembrie 2013 19:39:25
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

ifstream f("partitie.in");
ofstream g("partitie.out");

#define ll long long
#define pb push_back
#define mp make_pair
#define sz size
#define x first
#define y second

#define nmax 300006
#define inf (1<<29)

int n, D, grupa[nmax];
set< pair<int,int> > S;
vector< pair<int,int> > v;

void citeste(){
    f >> n >> D;
    for(int i=1; i<=n; ++i){
        int x; f >> x; v.pb( mp(x,i) );
    }sort(v.begin(), v.end());
}

void rezolva(){
    for(int i=0; i<n; ++i){
        if (S.sz() == 0){
            grupa[ v[i].y ] = 1;
            S.insert( mp(v[i].x, v[i].y) );
            continue;
        }
        if ( v[i].x - (*S.begin()).x >= D ){
            grupa[v[i].y] = grupa[ (*S.begin()).y ];
            S.erase(S.begin());
            S.insert( mp( v[i].x, v[i].y ) );
        }else {
            S.insert( mp( v[i].x, v[i].y ) );
            grupa[ v[i].y ] = (int)S.sz();
        }
    }

    g << (int)S.sz() << "\n";
    for(int i=1; i<=n; ++i){
        g << grupa[i] << "\n";
    }
}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}