Cod sursa(job #2782175)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 11 octombrie 2021 19:35:00
Problema Interclasari Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>

using namespace std;

struct InParser {
  FILE * fin;
  char * buff;
  int sp;

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

  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;
  }

  void close() {
    fclose(fin);
  }
};

struct OutParser {
  FILE * fout;
  char * buff;
  int sp;

  void write_ch(char ch) {
    if (sp == 50000) {
      fwrite(buff, 1, 50000, fout);
      sp = 0;
      buff[sp++] = ch;
    } else {
      buff[sp++] = ch;
    }
  }

  OutParser(const char *name) {
    fout = fopen(name, "w");
    buff = new char[50000]();
    sp = 0;
  }

  ~OutParser() {
    fwrite(buff, 1, sp, fout);
    fclose(fout);
  }

  OutParser & operator << (int vu32) {
    if (vu32 <= 9) {
      write_ch(vu32 + '0');
    } else {
      ( * this) << (vu32 / 10);
      write_ch(vu32 % 10 + '0');
    }
    return *this;
  }

  OutParser & operator << (char ch) {
    write_ch(ch);
    return *this;
  }

  OutParser & operator << (const char *ch) {
    while (*ch) {
      write_ch(*ch);
      ++ch;
    }
    return *this;
  }
};

InParser fin("interclasari.in");
OutParser fout("interclasari.out");

const int MAXK = 20;
int len[MAXK];
vector<int> a[MAXK];

void test_case() {
  int K;
  fin >> K;
  priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;
  int sum = 0;
  for (int i = 0; i < K; ++i) {
    fin >> len[i];
    sum += len[i];
    if (len[i] >= 1) {
      a[i].resize(len[i]);
      for (int &it : a[i]) {
        fin >> it;
      }
      pq.emplace(a[i][0], i, 0);
    }
  }
  fout << sum << '\n';
  while (pq.empty() == false) {
    int val, index, pos;
    tie(val, index, pos) = pq.top();
    pq.pop();
    fout << val << ' ';
    if (pos + 1 < len[index]) {
      pq.emplace(a[index][pos + 1], index, pos + 1);
    }
  }
  fout << '\n';
}

int main() {
  int t = 1;
  for (int tc = 1; tc <= t; ++tc) {
    test_case();
  }
  fin.close();
  return 0;
}