Submission #225413

#TimeUsernameProblemLanguageResultExecution timeMemory
225413gilles_deleuzeCandies (JOI18_candies)C++17
100 / 100
599 ms29816 KiB
#include <bits/stdc++.h>
using namespace std;

void solve(std::istream &in, std::ostream &out);

int main() {
#ifdef LOCAL
  freopen("../IO/f.in", "r", stdin);
//  freopen("../IO/f.out", "w", stdout);
#else
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);
#endif
  solve(std::cin, std::cout);
  return 0;
}


void solve(std::istream &in, std::ostream &out) {
  int n;
  in >> n;
  vector<int> a(n);
  for (int &i : a) in >> i;
  set<pair<int64_t, int>, greater<>> costs;
  set<pair<int, int64_t>> segs;
  for (int i = 0; i < n; ++i) {
    costs.emplace(a[i], i);
    segs.emplace(i, a[i]);
  }
  int64_t sum = 0;
  for (int iteration = 0; iteration < (n + 1) / 2; ++iteration) {
    pair<int64_t, int> f = *costs.begin();
    sum += f.first;
    auto it = segs.find(make_pair(f.second, f.first));
    if (it != segs.begin() && it != (--segs.end())) {
      int64_t new_cost = -f.first;
      new_cost += (++it)->second;
      int R = it->first;
      auto nxt = *it;
      costs.erase(make_pair(it->second, it->first));
      new_cost += (--(--it))->second;
      int L = it->first;
      auto prv = *it;
      costs.erase(make_pair(it->second, it->first));
      costs.erase(f);
      segs.erase(++it);
      segs.erase(nxt);
      segs.erase(prv);
      costs.emplace(new_cost, L);
      segs.emplace(L, new_cost);
    } else if (it == segs.begin()) {
      segs.erase(segs.begin());
      if (!segs.empty()) {
        costs.erase(make_pair(segs.begin()->second, segs.begin()->first));
        segs.erase(segs.begin());
      }
      costs.erase(f);
    } else {
      segs.erase(--segs.end());
      if (!segs.empty()) {
        auto itt = --segs.end();
        costs.erase(make_pair(itt->second, itt->first));
        segs.erase(itt);
      }
      costs.erase(f);
    }
    out << sum << '\n';
  }
}

Compilation message (stderr)

candies.cpp: In function 'void solve(std::istream&, std::ostream&)':
candies.cpp:39:11: warning: unused variable 'R' [-Wunused-variable]
       int R = it->first;
           ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...