Submission #1331727

#TimeUsernameProblemLanguageResultExecution timeMemory
1331727phancddevAncient Machine (JOI21_ancient_machine)C++20
100 / 100
43 ms7436 KiB
#include "Anna.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back

int A = 63, B = 44, f[100];

int encode(vector<int> v) {
  reverse(v.begin(), v.end());
  int res = 0;
  for (int i = 0; i < A; i++) if (v[i]) res += f[i];
  return res;
}

void Anna(signed n, vector<char> s) {
  f[0] = 1;
  f[1] = 2;
  for (int i = 2; i <= A; i++) f[i] = f[i - 1] + f[i - 2];

  vector<int> res;
  int id = 0;
  while (id < n && s[id] != 'X') ++id;
  if (id == n) {
    Send(0);
    return;
  }

  for (int i = 0; i < 17; i++) Send(!!((1 << i) & id));

  for (int i = id + 1; i < n; i++) {
    if (s[i] == 'Z' && (i == n - 1 || s[i + 1] != 'Z')) res.pb(1);
    else res.pb(0);
  }

  while ((int)res.size() % A) res.pb(0);

  for (int i = 0; i < (int)res.size(); i += A) {
    vector<int> temp(A);
    for (int j = 0; j < A; j++) temp[j] = res[i + j];
    int c = encode(temp);
    for (int j = 0; j < B; j++) Send(!!(c & (1ll << j)));
  }
}
#include "Bruno.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back

int A = 63, B = 44, f[100];
vector<int> vals;

void decode(int a) {
  for (int i = A - 1; i >= 0; --i) {
    if (a >= f[i]) a -= f[i], vals.pb(1);
    else vals.pb(0);
  }
}

void Bruno(signed n, signed l, vector<signed> a) {
  f[0] = 1;
  f[1] = 2;
  for (int i = 2; i <= A; i++) f[i] = f[i - 1] + f[i - 2];

  if (l == 1) {
    for (int i = 0; i < n; i++) Remove(i);
    return;
  }

  int id = 0;
  for (int i = 0; i < 17; i++) if (a[i]) id += (1 << i);

  vector<int> vect(1, id);

  for (int i = 17; i < (int)a.size(); i += B) {
    int res = 0;
    for (int j = 0; j < B; j++) if (i + j < (int)a.size() && a[i + j]) res += (1ll << j);
    decode(res);
  }

  for (int i = 0; i < (int)vals.size(); i++) if (vals[i]) vect.pb(i + id + 1);

  for (int i = 0; i < vect[0]; i++) Remove(i);
  for (int i = vect.back() + 1; i < n; i++) Remove(i);

  for (int i = 1; i < (int)vect.size(); i++) {
    for (int j = vect[i] - 1; j > vect[i - 1]; --j) Remove(j);
    Remove(vect[i]);
  }

  Remove(vect[0]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...