Submission #290941

#TimeUsernameProblemLanguageResultExecution timeMemory
290941Haunted_CppVision Program (IOI19_vision)C++17
58 / 100
22 ms2176 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 200 + 5;

int g[MAX_N][MAX_N];



void construct_network(int H, int W, int K) {
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      g[i][j] = i * W + j;
    }
  }
  vector<int> linha;
  vector<int> coluna;
  for (int i = 0; i < H; i++) {
    vector<int> ask;
    for (int j = 0; j < W; j++) {
      ask.emplace_back(g[i][j]);
    }
    linha.emplace_back(add_or(ask));
  }
  for (int j = 0; j < W; j++) {
    vector<int> ask;
    for (int i = 0; i < H; i++) {
      ask.emplace_back(g[i][j]);
    }
    coluna.emplace_back(add_or(ask));
  }
  vector<int> ans;
  for (int diff_linha = 1; diff_linha <= K; diff_linha++) {
    for (int diff_coluna = 1; diff_coluna + diff_linha <= K; diff_coluna++) {
      if (diff_linha + diff_coluna != K) continue;
      for (int i = 0; i + diff_linha < H; i++) {
        for (int j = 0; j + diff_coluna < W; j++) {
          ans.emplace_back(add_and({linha[i], linha[i + diff_linha], coluna[j], coluna[j + diff_coluna]}));
        }
      }
    }
  }
  
  // Same Row
  if (K < W) {
    vector<int> same_line;
    vector<int> col;
    for (int i = 0; i < H; i++) {
      vector<int> ask;
      for (int j = 0; j < W; j++) {
        ask.emplace_back(g[i][j]);
      }
      
      int A = add_xor(ask);
      int B = add_not(A);
      
      int C = linha[i];
      same_line.emplace_back(add_and({B, C}));
    }
    for (int j = 0; j + K < W; j++) {
      col.emplace_back(add_and({coluna[j], coluna[j + K]}) );
    }
    // HAS TO BE ONE
    int chk_xor = add_or(same_line);
    // HAS TO BE ONE
    int chk_col = add_or(col); 
    // MERGE BOTH
    ans.emplace_back(add_and({chk_col, chk_xor}));
  }
  // Same Col
  if (K < H) {
    vector<int> same_col;
    vector<int> lin;
    
    for (int j = 0; j < W; j++) {
      vector<int> ask;
      for (int i = 0; i < H; i++) {
        ask.emplace_back(g[i][j]);
      }
      int A = add_xor(ask);
      int B = add_not(A);
      int C = coluna[j];
      same_col.emplace_back(add_and({B, C}));
    }
    for (int j = 0; j + K < H; j++) {
      lin.emplace_back(add_and({linha[j], linha[j + K]}));
    }
    // HAS TO BE ONE
    int chk_xor = add_or(same_col);
    // HAS TO BE ONE
    int chk_lin = add_or(lin); 
    // MERGE BOTH
    ans.emplace_back(add_and({chk_xor, chk_lin}));
  }
    
  add_or(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...