Submission #198676

#TimeUsernameProblemLanguageResultExecution timeMemory
198676NightlightVision Program (IOI19_vision)C++14
100 / 100
51 ms4856 KiB
#include "vision.h"
#include <bits/stdc++.h>
#define eb emplace_back
using namespace std;

typedef pair<int, int> pii;
int R[405], L[405];
int diag[2][405], A[205][205];
int H, W, K, cnt;
int maxk;
vector<int> ask, all;
//diagonal jika 0 menghadap ke kanan, 1 menghadap ke kiri

void compress() {
  vector<int> diag0[H + W], diag1[H + W];
  cnt = 0;
  for(int i = 0; i < H; i++) {
    for(int j = 0; j < W; j++) {
      diag0[i + j].eb(cnt);
      diag1[(H - i - 1) + j].eb(cnt);
      A[i][j] = cnt++;
    }
  }
/*
  for(int i = 0; i < H; i++) {
    for(int j = 0; j < W; j++) {
      cout << i + j << " ";
    }
    cout << "\n";
  }
  cout << "\n\n";
  for(int i = 0; i < H; i++) {
    for(int j = 0; j < W; j++) {
      cout << (H - i - 1) + j << " ";
    }
    cout << "\n";
  }
  cout << "\n\n";
*/
  for(int i = 0; i < maxk; i++) {
    add_or(diag0[i]);
    diag[0][i] = cnt++;
    add_or(diag1[i]);
    diag[1][i] = cnt++;
  }
}

void add() {
  add_or(ask);
  add_xor(ask);
  add_not(cnt + 1);
  add_and({cnt, cnt + 2});
  all.eb(cnt + 3);
  cnt += 4;
}

int check(int len, int id) {
  //sliding window
  ask.clear(), all.clear();
  ask.resize(len);
  int p = 0;
  for(int i = 0; i < len; i++) {
    ask[i] = diag[id][i];
  }
  add();
  for(int i = len; i < maxk; i++) {
    ask[p] = diag[id][i], p = (p + 1) % len;
    add();
  }
  add_or(all), cnt++;
  return cnt - 1;
}

int getlen(int len) {
  R[len] = check(len + 1, 0);
  L[len] = check(len + 1, 1);
  add_and({R[len], L[len]}), cnt++;
  return cnt - 1;
}

void solve() {
  int valK = getlen(K);
  int valK1 = getlen(K - 1);
  add_not(valK1);
  add_and({valK, valK1 + 1});
  int com = cnt + 1;
  cnt += 2;
  //special case
  vector<int> tmp;
  tmp.resize(maxk);
  //right
  for(int i = 0; i < maxk; i++) {
    tmp[i] = diag[0][i];
  }
  add_xor(tmp);
  add_not(L[K - 1]);
  add_and({cnt, cnt + 1, L[K]});
  cnt += 3;
  int right = cnt - 1;
  //left
  for(int i = 0; i < maxk; i++) {
    tmp[i] = diag[1][i];
  }
  add_xor(tmp);
  add_not(R[K - 1]);
  add_and({cnt, cnt + 1, R[K]});
  cnt += 3;
  int left = cnt - 1;
  add_or({com, left, right});
}

void construct_network(int a1, int a2, int a3) {
  H = a1, W = a2, K = a3;
  maxk = H + W - 1;
  compress();
  solve();
}
#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...