제출 #1350659

#제출 시각아이디문제언어결과실행 시간메모리
1350659trimkus선물 (IOI25_souvenirs)C++20
100 / 100
9 ms412 KiB
#include "souvenirs.h"
// #include "debug.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()



void buy_souvenirs(int N, long long P0) {
  vector<ll> p(N, -1);
  vector<int> cnt(N);
  p[0] = P0;
  vector<set<int>> dep(N);
  vector<ll> sum(N);
  while (1) {
    int left = N;
    for (int i = 0; i < N; ++i) {
      left -= p[i] != -1;
    }
    if (left == 0) break;
    bool f = 0;
    // dbg(p);
    // dbg(cnt);
    for (int i = 0; i < N; ++i) {
      set<int> st;
      for (int j : dep[i]) {
        if (p[j] != -1) {
          sum[i] -= p[j];
        } else {
          st.insert(j);
        }
      }
      dep[i].swap(st);
      // cerr<<i<<":\n";
      // dbg(dep[i]);
      // dbg(sum[i]);
    }
    for (int i = N - 1; i >= 0; --i) {
      if (p[i] == -1) {
        f = 1;
      }
      if (p[i] != -1 && f) {
        auto now = transaction(p[i] - 1);
        ll cost = p[i] - 1 - now.second;
        set<int> st;
        for (int j : now.first) {
          cnt[j] += 1;
          if (p[j] != -1) cost -= p[j];
          else st.insert(j);
        }
        dep[i+1] = st;
        sum[i+1] = cost;
        break;
      }
      if (sz(dep[i]) == 1) {
        p[i]=sum[i];
        dep[i].clear();
        break;
      }
      if (sz(dep[i]) > 1) {
        ll ask = sum[i] / sz(dep[i]);
        auto now = transaction(ask);
        set<int> st;
        ask -= now.second;
        for (int j : now.first) {
          cnt[j] += 1;
          if (p[j] != -1) ask -= p[j];
          else st.insert(j);
        }
        dep[*begin(st)] = st;
        sum[*begin(st)] = ask;
        break;
      }
    }
  }
  for (int i = 0; i < N; ++i) {
    assert(p[i] != -1);
    while (cnt[i]++ < i) {
      // dbg(transaction(p[i]));
      transaction(p[i]);
    }
  }
}
#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...