제출 #1338022

#제출 시각아이디문제언어결과실행 시간메모리
1338022theobito선물 (IOI25_souvenirs)C++20
25 / 100
13 ms344 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <stack>

using namespace std;

void buy_souvenirs(int N, long long P0) {

  vector<long long> val(N, -1);
  vector<int> cnt(N, 0);
  val[0] = P0;

  int known = 1;

  stack<pair<vector<int>, long long>> s;

  while (known < N) {
    if (s.size()) {
      vector<int> a = s.top().first;
      long long sum = s.top().second;
      s.pop();
      
      vector<int> b;
      for (int &x : a) {
        if (val[x] != -1) sum -= val[x];
        else b.push_back(x);
      }
      swap(a, b);

      if (a.size() == 1) {
        val[a[0]] = sum;
        ++known;
      } else if (a.size() > 1) {
        s.push({a, sum});
        long long n = a.size();
        auto [res, rem] = transaction(sum / n);
        for (int &i : res) ++cnt[i];
        s.push({res, sum / n - rem});
      }
    } else {
      int i = 0;
      for (; i < N; i++) { 
        if (val[i] == -1) {
          i -= 1;
          break;
        }
      }
      auto [res, rem] = transaction(val[i] - 1);
      for (int &i : res) ++cnt[i];
      s.push({res, val[i] - 1 - rem});
    }
  }

  for (int i = 1; i < N; i++) {
    while (cnt[i] < i) {
      transaction(val[i]);
      ++cnt[i];
    }
  }

  return;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...