Cod sursa(job #3216937)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 20 martie 2024 15:35:47
Problema Partitie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};

InParser fin ("partitie.in");
ofstream fout ("partitie.out");

#define cin fin
#define cout fout

const int NMAX=3e5+5;

int color[NMAX];

struct elem{
    int val;
    int ind;
}v[NMAX];

bool cmp(elem a,elem b)
{
    if(a.val!=b.val)
        return a.val<b.val;
    return a.ind<b.ind;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cout.tie(NULL);

    int n,i,j,d,kon=0;
    cin>>n>>d;
    for(i=1;i<=n;i++)
    {
        cin>>v[i].val;
        v[i].ind=i;
    }
    sort(v+1,v+n+1,cmp);
    int st=1,dr=1;
    while(st<=n)
    {
        if(!color[v[st].ind])
            color[v[st].ind]=++kon;
        while(dr<=n && (color[v[dr].ind] || v[dr].val-v[st].val<d))
            dr++;
        if(dr<=n)
            color[v[dr].ind]=color[v[st].ind];
        st++;
    }
    cout<<kon<<"\n";
    for(i=1;i<=n;i++)
        cout<<color[i]<<"\n";
    cout.close();
    return 0;
}