Submission #1251207

#TimeUsernameProblemLanguageResultExecution timeMemory
1251207idiotcomputerSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
//IOI 2025 Day 1 Problem A 

#include <bits/stdc++.h>
using namespace std;
#define ll long long int 
#define pb push_back
#define sz(x) (int) (x).size()
#define vi vector<int>
#define f first
#define s second 
#include "souvenirs.h"

/*
namespace {
const int CALLS_CNT_LIMIT = 10'000;

int calls_cnt;
int N;
std::vector<long long> P;
std::vector<int> Q;

void quit(const char* message) {
  printf("%s\n", message);
  exit(0);
}
} // namespace

std::pair<std::vector<int>, long long> transaction(long long M) {
  calls_cnt++;
  //cout << M << '\n';
  if (calls_cnt > CALLS_CNT_LIMIT)
    quit("Too many calls");
  if (M >= P[0] || M < P[N - 1])
    quit("Invalid argument");

  std::vector<int> L;
  long long R = M;
  for (int i = 0; i < N; i++) {
    if (R >= P[i]) {
      R -= P[i];
      Q[i]++;
      L.push_back(i);
    }
  }
  return {L, R};
}*/



void buy_souvenirs(int n, long long int P0){

    ll tot[n];
    vi calls[n];
    ll vals[n];
    tot[0] = P0;
    calls[0].pb(0);
    vals[0] = P0;
    //cout << n << " " << P0 << '\n';
    //return;
    for (int i = n-1; i > 0; i--){
        
        while (sz(calls[i]) == 0){     
        
            int idx = i;
            for (; idx > 0; idx--) if (sz(calls[idx]) > 0) break;

            ll add = 0;
            ll mul = 0;
            for (int j : calls[idx]){
                if (j > i) add += vals[j];
                else add += i-j, mul++;
            }
            ll up = (tot[idx] - add) / mul;
            //cout << i << " - " << idx << " " << add << "," << mul << " " << up << '\n';
            pair<vi, ll> res = transaction(up);
            assert(sz(res.f) > 0);
            assert(res.f[0] > idx);
            for (int j : res.f) calls[res.f[0]].pb(j);            
            tot[res.f[0]] = up - res.s;
            //for (int j : res.f) cout << j << " ";
            //cout << " - " << sz(calls[i]) << "\n";
        }
        ll temp = tot[i];
        for (int j : calls[i]) if (j > i) temp -= vals[j];
        vals[i] = temp;
    }

    int cnts[n];
    memset(cnts,0,sizeof(cnts));
    for (int i = 0; i < n; i++) for (int j : calls[i]) cnts[j]++;
    for (int i = 0; i < n; i++) while (cnts[i] < i) transaction(vals[i]), cnts[i]++;
}



/*
int main() {
  assert(1 == scanf("%d", &N));
  P.resize(N);
  for (int i = 0; i < N; i++)
    assert(1 == scanf("%lld", &P[i]));
  fclose(stdin);

  Q.assign(N, 0);
  calls_cnt = 0;
  buy_souvenirs(N, P[0]);
  for (int i = 0; i < N; i++)
    printf("%s%d", i ? " " : "", Q[i]);
  printf("\n");
  fclose(stdout);

  return 0;
}
*/
#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...