Submission #1164613

#TimeUsernameProblemLanguageResultExecution timeMemory
1164613CDuongBroken Device (JOI17_broken_device)C++20
100 / 100
22 ms1572 KiB
#include "Annalib.h"
#include <bits/stdc++.h>
#define taskname ""
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define i64 long long
#define isz(x) (int)x.size()
#define FOR(i, l, r) for (int i = l; i < r; ++i)
using namespace std;

void Anna(int N, i64 X, int K, int P[]) {
  vector<int> a(N, -1);
  for (int i = 0; i < K; ++i) {
    a[P[i]] = 0;
  }
  deque<int> dq(120);
  for (int i = 0; i < 60; ++i) {
    dq[i] = X >> i & 1;
  }

  auto send = [&](int l, int val) -> void {
    for (int i = 0; i < 3; ++i) Set(l + i, val >> i & 1);
  };

  FOR(i, 0, 50) {
    int sum = 0, l = i * 3, r = (i + 1) * 3;
    FOR(j, l, r) sum += a[j] == 0;
    if (sum >= 2) {
      send(l, 0);
    }
    else if (sum == 1) {
      if (a[l] == 0) {
        send(l, dq[0] ? 6 : 4);
        dq.pop_front();
      }
      if (a[l + 1] == 0) {
        send(l, dq[0] ? 1 : 4);
        dq.pop_front();
      }
      if (a[l + 2] == 0) {
        send(l, dq[0] ? 1 : (dq[1] ? 3 : 2));
        if (not dq[0]) dq.pop_front();
        dq.pop_front();
      }
    }
    else {
      int val = dq[0] + dq[1] * 2;
      if (val == 0) send(l, 2);
      if (val == 1) send(l, 5);
      if (val == 2) send(l, 3);
      if (val == 3) send(l, 7);
      dq.pop_front();
      dq.pop_front();
    }
  }
}
#include "Brunolib.h"
#include <bits/stdc++.h>
#define taskname ""
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define i64 long long
#define isz(x) (int)x.size()
#define FOR(i, l, r) for (int i = l; i < r; ++i)
using namespace std;

i64 Bruno(int N, int A[]) {
  vector<i64> res;
  FOR(i, 0, 50) {
    int val = 0, l = i * 3, r = (i + 1) * 3;
    FOR(j, l, r) val += A[j] << (j - l);
    if (val == 0) continue;
    if (val == 1) res.emplace_back(1);
    if (val == 2) res.emplace_back(0), res.emplace_back(0);
    if (val == 3) res.emplace_back(0), res.emplace_back(1);
    if (val == 4) res.emplace_back(0);
    if (val == 5) res.emplace_back(1), res.emplace_back(0);
    if (val == 6) res.emplace_back(1);
    if (val == 7) res.emplace_back(1), res.emplace_back(1);
  }
  i64 ans = 0;
  for (int i = 0; i < 60; ++i) {
    ans += res[i] << i;
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...