이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |