Submission #1331725

#TimeUsernameProblemLanguageResultExecution timeMemory
1331725phancddevAncient Machine (JOI21_ancient_machine)C++20
5 / 100
31 ms3400 KiB
#include "Anna.h"
#include <vector>
using namespace std;


int enc(char c){
  if(c=='X') return 0;
  if(c=='Y') return 1;
  return 2; // Z
}

void Anna(int N, vector<char> S) {

  for(int i=0;i<N;i++){
    int v = enc(S[i]);
    Send(v & 1);
    Send((v >> 1) & 1);
  }
}
#include "Bruno.h"
#include <vector>
#include <algorithm>
using namespace std;

static int dec(int b0, int b1){ return b0 | (b1<<1); }

void Bruno(int N, int L, vector<int> A) {
  vector<char> S(N);
  for(int i=0;i<N;i++){
    int v = dec(A[2*i], A[2*i+1]);
    if(v==0) S[i]='X';
    else if(v==1) S[i]='Y';
    else S[i]='Z';
  }

  int FULL = (1<<N) - 1;
  const int NEG = -1e9;

  vector<int> dp(1<<N, NEG);
  vector<int> par_mask(1<<N, -1);
  vector<int> par_i(1<<N, -1);

  auto is_good = [&](int mask, int i)->int{
    if(S[i] != 'Y') return 0;

    int x = -1;
    for(int j=i-1;j>=0;j--){
      if(((mask>>j)&1)==0){ x=j; break; }
    }

    int z = -1;
    for(int j=i+1;j<N;j++){
      if(((mask>>j)&1)==0){ z=j; break; }
    }

    if(x==-1 || z==-1) return 0;
    return (S[x]=='X' && S[z]=='Z') ? 1 : 0;
  };

  dp[0]=0;
  for(int mask=0; mask<=FULL; mask++){
    if(dp[mask]==NEG) continue;
    for(int i=0;i<N;i++){
      if((mask>>i)&1) continue;
      int nmask = mask | (1<<i);
      int gain = is_good(mask, i);
      if(dp[nmask] < dp[mask] + gain){
        dp[nmask] = dp[mask] + gain;
        par_mask[nmask] = mask;
        par_i[nmask] = i;
      }
    }
  }

  vector<int> order;
  int cur = FULL;
  while(cur){
    int i = par_i[cur];
    order.push_back(i);
    cur = par_mask[cur];
  }
  reverse(order.begin(), order.end());

  for(int i: order) Remove(i);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...