Cod sursa(job #1000948)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 23 septembrie 2013 23:44:50
Problema Partitie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMax 300010

using namespace std;

int nrsub;
int n, D;
int sol[NMax];
struct multime
{
    int value, position;
    bool operator < (const multime &A) const
    {
        return value < A.value;
    }
};
multime a[NMax];

inline void Read()
{
    ifstream f ("partitie.in");
    f>>n>>D;
    int i;
    for (i=1; i<=n; ++i)
    {
        f>>a[i].value;
        a[i].position = i;
    }
    f.close();
}

inline void Solve()
{
    sort(a+1, a+n+1);
    int Left, Right;
    for (Left = 1, Right = 2; Left <= n; ++Left)
    {
        if (!sol[a[Left].position])
            sol[a[Left].position] = ++nrsub;
        while (sol[a[Right].position])
            ++Right;
        while (Right <= n && a[Right].value - a[Left].value < D)
            ++Right;
        if (Right <= n && a[Right].value - a[Left].value >= D)
            sol[a[Right].position] = sol[a[Left].position];
    }
}

inline void Write()
{
    ofstream g("partitie.out");
    g<<nrsub<<"\n";
    int i;
    for (i=1; i<=n; ++i)
        g<<sol[i]<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}