This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXH 205
#define MAXW 205
int h,w,k;
vector<int> right_d1,right_d2;//1=or, 2=ex2
vector<int> left_d1,left_d2;
vector<int> d1,d2;
vector<int> left_1,right_1,left_2,right_2;
int id(int x,int y){//x in 0..h-1, y in 0..w-1
return x*w+y;
}
bool inbounds(int x,int y){
return 0<=x&&x<h&&0<=y&&y<w;
}
int ex2(vector<int> v){
return add_and({add_or(v),add_not(add_xor(v))});
}
void construct_network(int H, int W, int K) {
h=H;
w=W;
k=K;
left_d1.clear();
left_d2.clear();
right_d1.clear();
right_d2.clear();
//left diagonals
for(int y=0;y<w;y++){
d1.clear();
for(int i=0;i<h;i++){
if(inbounds(i,y-i)) d1.push_back(id(i,y-i));
}
int ans11=add_or(d1);
int ans12=add_xor(d1);
left_d1.push_back(ans11);
left_d2.push_back(ans12);
}
for(int x=1;x<h;x++){
d1.clear();
for(int i=0;i<w;i++){
if(inbounds(x+i,w-1-i)) d1.push_back(id(x+i,w-1-i));
}
int ans11=add_or(d1);
int ans12=add_xor(d1);
left_d1.push_back(ans11);
left_d2.push_back(ans12);
}
//right diagonals
for(int x=h-1;x>0;x--){
d2.clear();
for(int i=0;i<w;i++){
if(inbounds(x+i,i)) d2.push_back(id(x+i,i));
}
int ans21=add_or(d2);
int ans22=add_xor(d2);
right_d1.push_back(ans21);
right_d2.push_back(ans22);
}
for(int y=0;y<w;y++){
d2.clear();
for(int i=0;i<h;i++){
if(inbounds(i,y+i)) d2.push_back(id(i,y+i));
}
int ans21=add_or(d2);
int ans22=add_xor(d2);
right_d1.push_back(ans21);
right_d2.push_back(ans22);
}
left_1.clear();
right_1.clear();
left_2.clear();
right_2.clear();
for(int i=0;i<h+w-k;i++){
vector<int> wantedl1=vector<int>(&left_d1[i],&left_d1[i+k]);
vector<int> wantedl2=vector<int>(&left_d2[i],&left_d2[i+k]);
left_1.push_back(add_and({add_or(wantedl1),add_not(add_xor(wantedl2))}));
vector<int> wantedr1=vector<int>(&right_d1[i],&right_d1[i+k]);
vector<int> wantedr2=vector<int>(&right_d2[i],&right_d2[i+k]);
right_1.push_back(add_and({add_or(wantedr1),add_not(add_xor(wantedr2))}));
}
int ans1=add_and({add_or(left_1),add_or(right_1)});
for(int i=0;i<h+w-k-1;i++){
vector<int> wantedl1=vector<int>(&left_d1[i],&left_d1[i+k+1]);
vector<int> wantedl2=vector<int>(&left_d2[i],&left_d2[i+k+1]);
left_2.push_back(add_and({add_or(wantedl1),add_not(add_xor(wantedl2))}));
vector<int> wantedr1=vector<int>(&right_d1[i],&right_d1[i+k+1]);
vector<int> wantedr2=vector<int>(&right_d2[i],&right_d2[i+k+1]);
right_2.push_back(add_and({add_or(wantedr1),add_not(add_xor(wantedr2))}));
}
int ans2=add_and({add_or(left_2),add_or(right_2)});
add_xor({ans1,ans2});
}
# | 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... |