# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
894352 | 2023-12-28T07:06:32 Z | Faisal_Saqib | Vision Program (IOI19_vision) | C++17 | 0 ms | 0 KB |
#include <vector> #include <string> #include <map> using namespace std; int add_and(std::vector<int> Ns); int add_or(std::vector<int> Ns); int add_xor(std::vector<int> Ns); int add_not(int N); int h,w,k; int which_diagonal1[40001]; int dia=0; int dia1=0; int which_diagonal2[40001]; int index_of_diagonal1[401]; int index_of_diagonal2[401]; int f(int i,int j) { return (i*w)+j; } int check_distance_is_atmost_x(int x) { // check subarray of length x+1 vector<int> dp; for(int di=0;(di+x)<dia;di++) { vector<int> cur; for(int j=0;j<=x;j++) cur.push_back(index_of_diagonal1[di+j]); dp.push_back(add_xor({add_xor(cur),add_or(cur)})); } // Ask xor and or // if xor==0 and or==1 then distance is atmost // if(dp.size()==0) // { // cout<<"size of dp is "<<0<<endl; // exit(-100); // } return add_or(dp); } int check_distance_is_atmost_x1(int x) { // // check subarray of length x+1 // { // vector<int> dp; // for(int di=0;(di)<dia1;di++) // dp.push_back(di); // if(add_xor(dp)) // } vector<int> dp; for(int di=0;(di+x)<dia1;di++) { vector<int> cur; for(int j=0;j<=x;j++) cur.push_back(index_of_diagonal2[di+j]); dp.push_back(add_xor({add_xor(cur),add_or(cur)})); } // Ask xor and or // if xor==0 and or==1 then distance is atmost return add_or(dp); } void construct_network(int H, int W, int K) { h=H; w=W; k=K; for(int j=0;j<1;j++) { for(int i=h-1;i>=0;i--) { vector<int> element; int ci=i; int cj=j; while(ci<h and cj<w) { element.push_back(f(ci,cj)); which_diagonal1[f(ci,cj)]=dia; ci++; cj++; } index_of_diagonal1[dia]=add_or(element); dia++; } } for(int i=0;i<1;i++) { for(int j=1;j<w;j++) { int ci=i; int cj=j; vector<int> element; while(ci<h and cj<w) { element.push_back(f(ci,cj)); which_diagonal1[f(ci,cj)]=dia; ci++; cj++; } index_of_diagonal1[dia]=add_or(element); dia++; } } int fff=check_distance_is_atmost_x(k); int fss=check_distance_is_atmost_x(k-1); dia1=0; for(int i=0;i<1;i++) { for(int j=0;j<w;j++) { int ci=i; int cj=j; vector<int> element; while(ci<h and cj>=0) { element.push_back(f(ci,cj)); ci++; cj--; } index_of_diagonal2[dia1]=add_or(element); dia1++; } } for(int j=w-1;j<w;j++) { for(int i=1;i<h;i++) { int ci=i; int cj=j; vector<int> element; while(ci<h and cj>=0) { element.push_back(f(ci,cj)); ci++; cj--; } index_of_diagonal2[dia1]=add_or(element); dia1++; } } int fff1=check_distance_is_atmost_x1(k); int fss1=check_distance_is_atmost_x1(k-1); add_and({add_and({fff1,fff}),add_of({add_not(fss1),add_not(fss)})}); }