# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1239107 | Ludissey | Sky Walking (IOI19_walk) | C++20 | 0 ms | 0 KiB |
#include "vision.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
int h,w;
using namespace std;
int conv(int i, int j){
return (j+i*w);
}
int dist(int i, int j, int _i, int _j){
return (abs(i-_i)+abs(j-_j));
}
void construct_network(int H, int W, int K) {
h=H;
w=W;
if(min(H,W)==1||K>=100){
vector<int> nodesCHECK;
for (int i = 0; i < H; i++)
{
for (int j = 0; j < W; j++)
{
vector<int> tocheck;
for (int _i = 0; _i < H; _i++)
{
for (int _j = j; _j < W; _j++)
{
if(dist(i,j,_i,_j)==K) tocheck.push_back(conv(_i,_j));
}
}
if(sz(tocheck)>0){
nodesCHECK.push_back(add_and({conv(i,j),add_or(tocheck)}));
}
}
}
add_or(nodesCHECK);
return;
}
vector<int> row;
vector<int> col;
for (int i = 0; i < H; i++)
{
vector<int> add;
for (int j = 0; j < W; j++) add.push_back(conv(i,j));
row.push_back(add_or(add));
}
for (int j = 0; j < W; j++)
{
vector<int> add;
for (int i = 0; i < H; i++) add.push_back(conv(i,j));
col.push_back(add_or(add));
}
vector<int> rrow;
for (int i = 0; i < H-1; i++)
{
rrow.push_back(add_and({row[i],row[i+1]}));
}
vector<int> ccol;
for (int i = 0; i < W-1; i++)
{
ccol.push_back(add_and({col[i],col[i+1]}));
}
add_or({add_and({add_or(rrow),add_xor(col)}), add_and({add_or(ccol),add_xor(row)})});
}