Submission #1209210

#TimeUsernameProblemLanguageResultExecution timeMemory
1209210mychecksedadBroken Device (JOI17_broken_device)C++20
81 / 100
28 ms1576 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
#include "Annalib.h"
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;


void Anna( int n, long long X, int k, int p[] ){

  vi O = {138, 40, 66, 96, 21, 16, 19, 45, 43, 140, 58, 50, 86, 36, 149, 42, 116, 128, 121, 125, 88, 52, 44, 10, 110, 91, 104, 119, 109, 113, 92, 97, 132, 69, 72, 56, 49, 5, 79, 101, 94, 15, 34, 100, 70, 103, 55, 134, 38, 77, 117, 7, 126, 22, 29, 87, 108, 114, 54, 8, 145, 137, 32, 133, 115, 78, 61, 68, 27, 122, 99, 76, 120, 57, 23, 64, 30, 46, 35, 62, 67, 9, 41, 24, 13, 28, 143, 14, 93, 33, 82, 130, 98, 17, 89, 95, 60, 74, 20, 107, 148, 124, 147, 105, 144, 12, 0, 142, 139, 129, 80, 106, 83, 118, 51, 146, 18, 11, 4, 31, 85, 25, 141, 111, 84, 127, 90, 63, 73, 1, 6, 123, 81, 3, 102, 59, 47, 37, 136, 39, 2, 26, 48, 71, 131, 65, 53, 75, 135, 112};
  vector<int> good(n, 1);
  for(int i = 0; i < k; ++i) good[p[i]] = 0;
    
  int ptr = 0;

  function<int(int)> get = [&](int d) {
    int val = X % d;
    X /= d;
    return val;
  };

  for(int i = 3; i < n; i += 4){
    int bad = 4 - (good[O[i]] + good[O[i-1]] + good[O[i-2]] + good[O[i-3]]);
    if(bad == 0){
      Set(O[i], 1);
      for(int j = i-3; j < i; ++j){
        Set(O[j], get(2));
      }
    }else if(bad == 1){
      Set(O[i], 0);
      int val = get(3);
      if(good[O[i]] == 0){
        if(val == 0){
          Set(O[i-3], 0);
          Set(O[i-2], 0);
          Set(O[i-1], 1);
        }else if(val == 1){
          Set(O[i-3], 0);
          Set(O[i-2], 1);
          Set(O[i-1], 0);
        }else{
          Set(O[i-3], 0);
          Set(O[i-2], 1);
          Set(O[i-1], 1);
        }
      }else if(good[O[i-3]] == 0){
        if(val == 0){
          Set(O[i-3], 0);
          Set(O[i-2], 0);
          Set(O[i-1], 1);
        }else if(val == 1){
          Set(O[i-3], 0);
          Set(O[i-2], 1);
          Set(O[i-1], 0);
        }else{
          Set(O[i-3], 0);
          Set(O[i-2], 1);
          Set(O[i-1], 1);
        }
      }else if(good[O[i-2]] == 0){
        if(val == 0){
          Set(O[i-3], 0);
          Set(O[i-2], 0);
          Set(O[i-1], 1);
        }else if(val == 2){
          Set(O[i-3], 1);
          Set(O[i-2], 0);
          Set(O[i-1], 0);
        }else{
          Set(O[i-3], 1);
          Set(O[i-2], 0);
          Set(O[i-1], 1);
        }
      }else{
        if(val == 0){
          Set(O[i-3], 1);
          Set(O[i-2], 1);
          Set(O[i-1], 0);
        }else if(val == 1){
          Set(O[i-3], 0);
          Set(O[i-2], 1);
          Set(O[i-1], 0);
        }else{
          Set(O[i-3], 1);
          Set(O[i-2], 0);
          Set(O[i-1], 0);
        }
      }
    }else{
      Set(O[i], 0);
      Set(O[i-1], 0);
      Set(O[i-2], 0);
      Set(O[i-3], 0);
    }
  }
  if(good[O[n-1]] && good[O[n-2]]){
    if(get(2)){
      Set(O[n-1], 1);
      Set(O[n-2], 1);
    }else{
      Set(O[n-1], 1);
      Set(O[n-2], 0);
    }
  }else{
    Set(O[n-2], 0);
    Set(O[n-1], 0);
  }
}
#include<bits/stdc++.h>
#include "Brunolib.h"
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;

long long Bruno( int n, int a[] ){

  
  vi O = {138, 40, 66, 96, 21, 16, 19, 45, 43, 140, 58, 50, 86, 36, 149, 42, 116, 128, 121, 125, 88, 52, 44, 10, 110, 91, 104, 119, 109, 113, 92, 97, 132, 69, 72, 56, 49, 5, 79, 101, 94, 15, 34, 100, 70, 103, 55, 134, 38, 77, 117, 7, 126, 22, 29, 87, 108, 114, 54, 8, 145, 137, 32, 133, 115, 78, 61, 68, 27, 122, 99, 76, 120, 57, 23, 64, 30, 46, 35, 62, 67, 9, 41, 24, 13, 28, 143, 14, 93, 33, 82, 130, 98, 17, 89, 95, 60, 74, 20, 107, 148, 124, 147, 105, 144, 12, 0, 142, 139, 129, 80, 106, 83, 118, 51, 146, 18, 11, 4, 31, 85, 25, 141, 111, 84, 127, 90, 63, 73, 1, 6, 123, 81, 3, 102, 59, 47, 37, 136, 39, 2, 26, 48, 71, 131, 65, 53, 75, 135, 112};
  ll ans = 0;
  vector<pii> v;
  map<string, int> m;
  m["001"] = 0;
  m["010"] = 1;
  m["011"] = 2;
  m["100"] = 2;
  m["101"] = 1;
  m["110"] = 0;
  for(int i = 3; i < n; i += 4){
    if(a[O[i]]){
      int num = a[O[i - 3]] + 2 * a[O[i - 2]] + 4 * a[O[i - 1]];
      v.pb({num, 8});
    }else{
      string t;
      t += char(a[O[i - 3]] + '0');
      t += char(a[O[i - 2]] + '0');
      t += char(a[O[i - 1]] + '0');
      if(t != "000"){
        v.pb({m[t], 3});
      }
    }
  }
  if(a[O[n-1]] || a[O[n-2]]){
    if(a[O[n-1]] && a[O[n-2]]) v.pb({1, 2});
    else v.pb({0, 2});
  }
  reverse(all(v));
  for(auto [b, c]: v){
    ans *= c;
    ans += b;
  }

  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...