Submission #1169337

#TimeUsernameProblemLanguageResultExecution timeMemory
1169337LucaLucaMBoxes with souvenirs (IOI15_boxes)C++20
10 / 100
1 ms328 KiB
#include "boxes.h"
#include <vector>
#include <algorithm>
#include <iostream>

using ll = long long;
#define debug(x) #x << " = " << x << '\n'

ll delivery(int n, int k, int L, int p[]) {
  std::vector<std::pair<int, int>> v(n);
  for (int i = 0; i < n; i++) {
    v[i].first = std::min(p[i], L - p[i]);
    v[i].second = p[i];
  } 

  std::sort(v.begin(), v.end());
  std::reverse(v.begin(), v.end());

  std::vector<int> st, dr;
  for (int i = 0; i < n; i++) {
    if (v[i].first == v[i].second) {
      st.push_back(v[i].first);
    } else {
      dr.push_back(v[i].first);
    }
  }

  std::sort(st.begin(), st.end());
  std::sort(dr.begin(), dr.end());

  ll answer = 1e18;

  std::vector<ll> sumst((int) st.size(), 0);
  std::vector<ll> sumdr((int) dr.size(), 0);
  
  for (int i = 0; i < (int) st.size(); i++) {
    sumst[i] = st[i];
    if (i >= k) {
      sumst[i] += sumst[i - k];
    }
  }
  for (int i = 0; i < (int) dr.size(); i++) {
    sumdr[i] = dr[i];
    if (i >= k) {
      sumdr[i] += sumdr[i - k];
    }
  }

  for (int catel = 0; catel <= (int) st.size(); catel++) { // dintre turele full, cate sterg din st?
    // catel + cater = 0 (mod k) <=> cater = k - catel (mod k)
    if (catel % k == 0) {
      ll me = 0;
      if (catel < (int) st.size()) {
        me += (ll) 2 * sumst[(int) st.size() - catel - 1];
      }
      me += (ll) L * catel / k;
      for (int cater = 0; cater <= (int) dr.size(); cater += k) {
        ll you = 0;
        if (cater < (int) dr.size()) {
          you += (ll) 2 * sumdr[(int) dr.size() - cater - 1];
        }
        you += (ll) L * cater / k;
        answer = std::min(answer, me + you);
      }
    } else {
      ll me = 0;
      if (catel < (int) st.size()) {
        me += (ll) 2  * sumst[(int) st.size() - catel - 1];
      }
      me += (ll) L * catel / k + L;
      for (int cater = k - catel % k; cater <= (int) dr.size(); cater += k) {
        ll you = 0;
        if (cater < (int) dr.size()) {
          you += (ll) 2 * sumdr[(int) dr.size() - cater - 1];
        }
        you += (ll) L * cater / k;
        answer = std::min(answer, me + you);
      }
    }
  }
  
  return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...