Cod sursa(job #2058118)

Utilizator cella.florescuCella Florescu cella.florescu Data 5 noiembrie 2017 10:14:38
Problema Ghiozdan Scor 72
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXG = 75e3;
const int MAXOBJ = 200;
const int INF = 0x7f7f7f7f;

deque <pair <int, int>> deq;
int dp[2][MAXG + 1], prv[2][MAXG + 1], freq[MAXOBJ + 1];

ofstream fout("ghiozdan.out");

void solve(int l, int r, int gr) {
  if (gr == 0)
    return;
  if (l == r) {
    for (int i = 0; i < freq[l] && i * l < gr; ++i)
      fout << l << '\n';
    return;
  }
  int mid = (l + r) / 2, ind = (l & 1);
  memset(dp, INF, sizeof dp);
  dp[1 - (l & 1)][0] = 0;
  for (int i = l; i <= r; ++i, ind = 1 - ind)
    if (freq[i]) {
      for (int rest = 0; rest < i; ++rest) {
        deq.clear();
        for (int j = rest; j <= gr; j += i) {
          int cost = dp[1 - ind][j] + j / i;
          while (deq.empty() == false && deq.front().first < j - i * freq[i])
            deq.pop_front();
          while (deq.empty() == false && deq.back().second >= cost)
            deq.pop_back();
          deq.push_back({j, cost});
          cost = deq.front().first;
          dp[ind][j] = dp[1 - ind][cost] + (j - cost) / i;
          prv[ind][j] = (i > mid) ? prv[1 - ind][cost] : j;
        }
      }
    } else
      ind = 1 - ind;
  ind = 1 - ind;
  int lstgr = gr;
  while (lstgr >= 0 && dp[ind][lstgr] >= INF)
    --lstgr;
  if (l == 1 && r == MAXOBJ)
    fout << lstgr << " " << dp[ind][lstgr] << '\n';
  solve(l, mid, prv[ind][lstgr]);
  solve(mid + 1, r, gr - prv[ind][lstgr]);
}

int main()
{
    int n, g;
    ifstream fin("ghiozdan.in");
    fin >> n >> g;
    for (int i = 0; i < n; ++i) {
      int num;
      fin >> num;
      ++freq[num];
    }
    fin.close();
    solve(1, 200, g);
    fout.close();
    return 0;
}