Submission #1254107

#TimeUsernameProblemLanguageResultExecution timeMemory
1254107garam1732Souvenirs (IOI25_souvenirs)C++20
Compilation error
0 ms0 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define bl ' '
#define endl '\n'
#define all(v) (v).begin(), (v).end()
#define comp(v) (v).erase(unique(all(v)), (v).end())
#define lbd(v,x) lower_bound(all(v), (x))-(v).begin()
#define ubd(v,x) upper_bound(all(v), (x))-(v).begin()

typedef long long ll;
typedef pair<int, int> pi;
typedef pair<pi, int> pii;
typedef pair<int, pi> ipi;
typedef pair<pi, pi> pipi;
typedef pair<ll, ll> pll;

const int MAXN = 100100*1;
const ll MOD = 1e9+7;
const ll INF = 1e9+10;

pair<vector<int>, ll> res;
int cnt[110];
ll arr[110];

std::pair<std::vector<int>, long long> transaction(long long M);

void dnc(int s, int e, ll tot) {
    ll sum = tot - res.ss;
    auto v = res.ff; int sz = v.size();

    if(s == e) {
        arr[s] = sum;
        return;
    }

    if(sz == 1) {
        arr[s] = sum;
        res = transaction(sum-1);
        for(int x:res.ff) cnt[x]++;
        dnc(s+1, e, sum-1);
        return;
    }

    ll avg = sum/sz;
    res = transaction(avg);
    for(int x:res.ff) cnt[x]++;
    int idx = res.ff[0];
    dnc(idx, e, avg);

    while(v.size() && v.back() >= idx) {
        sum -= arr[v.back()]; v.pop_back();
    }

    res = make_pair(v, 0);
    dnc(s, idx-1, sum);
}

void buy_souvenirs(int N, ll P0) {
    res = transaction(P0-1);
    for(int x:res.ff) cnt[x]++;
    dnc(1, N-1, P0-1);

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


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<<": ";
  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);
    }
  }for(int x:L)cout<<x<<bl;cout<<R<<endl;
  return {L, R};
}

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;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccBMArby.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccWHkCDo.o:souvenirs.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccBMArby.o: in function `transaction(long long)':
stub.cpp:(.text+0x1d0): multiple definition of `transaction(long long)'; /tmp/ccWHkCDo.o:souvenirs.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status