Submission #1144689

#TimeUsernameProblemLanguageResultExecution timeMemory
1144689otesunkiSaveit (IOI10_saveit)C++20
25 / 100
122 ms9768 KiB
#include <bits/stdc++.h>
#include "grader.h"
#include "encoder.h"

static unsigned fib[46] = {
           1U,          2U,         3U,          5U,
           8U,         13U,        21U,         34U,
          55U,         89U,       144U,        233U,
         377U,        610U,       987U,       1597U,
        2584U,       4181U,      6765U,      10946U,
       17711U,      28657U,     46368U,      75025U,
      121393U,     196418U,    317811U,     514229U,
      832040U,    1346269U,   2178309U,    3524578U,
     5702887U,    9227465U,  14930352U,   24157817U,
    39088169U,   63245986U, 102334155U,  165580141U,
   267914296U,  433494437U, 701408733U, 1134903170U,
  1836311903U, 2971215073U
};

void encode_fib(unsigned x) {
  char unsigned fibc[46] = { 0 };

  ++x;

  int i = 45;
  while (x < fib[i]) {
    --i;
  }

  int j = i;

  for (; i >= 0; --i) {
    if (x >= fib[i]) {
      x -= fib[i];
      ++fibc[i];
    }
  }

  for (int i = 0; i <= j; ++i)
    encode_bit(fibc[i]);
  encode_bit(1);
}

template<typename T> using Vec = std::vector<T>;

Vec<int> bfs(int hub, int nv, const Vec<Vec<int>>& giraffe) {
    const int invalid = -1;

    Vec<int> dist(nv);
    std::fill(dist.begin(), dist.end(), invalid);

    std::queue<std::pair<int, int>> q; q.emplace(hub, 0);

    while (!q.empty()) {
        auto [u, distance] = q.front(); q.pop();
        if (dist[u] != invalid) continue;
        dist[u] = distance++;
        for (const auto& v : giraffe[u]) {
            q.emplace(v, distance);
        }
    }

    return dist;
}

void encode(int nv, int nh, int ne, int *v1, int *v2){
    Vec<Vec<int>> giraffe(nv);
    for (int i = 0; i < ne ; ++i) {
        int u = v1[i];
        int v = v2[i];
        giraffe[u].push_back(v);
        giraffe[v].push_back(u);
    }

    for (int hub = 0; hub < nh; hub++) {
        Vec<int> distances = bfs(hub, nv, giraffe);
        for (int i = 0; i < nv; ++i) {
            encode_fib(distances[i]);
        }
    }

    return;
}
#include <bits/stdc++.h>
#include "grader.h"
#include "decoder.h"

static unsigned fib[46] = {
           1U,          2U,         3U,          5U,
           8U,         13U,        21U,         34U,
          55U,         89U,       144U,        233U,
         377U,        610U,       987U,       1597U,
        2584U,       4181U,      6765U,      10946U,
       17711U,      28657U,     46368U,      75025U,
      121393U,     196418U,    317811U,     514229U,
      832040U,    1346269U,   2178309U,    3524578U,
     5702887U,    9227465U,  14930352U,   24157817U,
    39088169U,   63245986U, 102334155U,  165580141U,
   267914296U,  433494437U, 701408733U, 1134903170U,
  1836311903U, 2971215073U
};

unsigned decode_fib(void) {
  unsigned prev = 0, current = 0, i = 0, tally = 0;
  while (prev = current, current = decode_bit(), !prev || !current) {
    if (current) {
      tally += fib[i];
    }
    ++i;
  }

  return tally-1;
}

void decode(int nv, int nh) {
   for (int hub = 0; hub < nh; hub++) {
      for (int i = 0; i < nv; ++i) {
         hops(hub, i, decode_fib());
      }
   }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...