Cod sursa(job #1704515)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 18 mai 2016 21:45:16
Problema Partitie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <set>
#include <functional>
#include <algorithm>

using namespace std;

const int N_MAX = 300005;

class InputReader {
   public:
      InputReader() {}
      InputReader(const char *file_name) {
         input_file = fopen(file_name, "r");
         cursor = 0;
         fread(buffer, SIZE, 1, input_file);
      }
      inline InputReader &operator >>(int &n) {
         while (buffer[cursor] < '0' || buffer[cursor] > '9') {
            advance();
         }
         n = 0;
         while ('0' <= buffer[cursor] && buffer[cursor] <= '9') {
            n = n * 10 + buffer[cursor] - '0';
            advance();
         }
         return *this;
      }
   private:
      FILE *input_file;
      static const int SIZE = 1 << 17;
      int cursor;
      char buffer[SIZE];
      inline void advance() {
         ++ cursor;
         if (cursor == SIZE) {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
         }
      }
};

int N, D;
int indx[N_MAX];
pair<int, int> v[N_MAX];
multiset<pair<int, int>> _set;

int main() {
   InputReader f("partitie.in");
   ofstream g("partitie.out");
   
   f >> N >> D;
   for(int i = 1; i <= N; i++)
      f >> v[i].first, v[i].second = i;
   
   sort(v+1, v+N+1);
   for(int i = 1; i <= N; i++) {
      if(_set.begin()->first <= v[i].first - D) {
         indx[v[i].second] = _set.begin()->second;
         _set.erase(_set.begin());
      }
      else {
         indx[v[i].second] = _set.size() + 1;
      }
      _set.insert(make_pair(v[i].first, indx[v[i].second]));
   }
   
   g << _set.size() << '\n';
   for(int i = 1; i <= N; i++)
      g << indx[i] << '\n';
   
   return 0;
}