제출 #1307384

#제출 시각아이디문제언어결과실행 시간메모리
1307384_as3adVision Program (IOI19_vision)C++20
32 / 100
864 ms3920 KiB
#include <bits/stdc++.h> #include "vision.h" using namespace std; #define ll long long //#define int long long #define all(x) x.begin(), x.end() #define siz(x) ((int)x.size()) #define yes cout << "YES\n" #define no cout << "NO\n" #define f first #define s second /* #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; */ const int mod = 1e9+7; const int N = 20005; const long long inf = 1e12+12; double eps = 1e-9; vector<vector<int>> hi; int cur; int h, w, k; vector<vector<int>> meto ( ) { vector<array<int,2>>vect; for(int i=0;i<h;++i){ for(int j=0;j<w;++j){ vect.push_back({i,j}); } } vector<vector<int>> ans( siz(vect)+3 ); for(int i =0;i<vect.size();++i){ for(int j =i+1;j<vect.size();++j){ int sz = abs(vect[i][0]-vect[j][0])+abs(vect[i][1]-vect[j][1]); if(sz==k) ans[i].push_back(j); } } return ans; } vector<int> r(int i) { vector<int> ans; for (int j=0; j<w; j++) ans.push_back( i*w+j ); return ans; } vector<int> c(int j) { vector<int> ans; for (int i=0; i<h; i++) ans.push_back( i*w+j ); return ans; } void normal () { vector<int> can; for (int i=0; i<h*w; i++) { if ( siz( hi[i] ) == 0 ) continue; add_or( hi[i] ); add_and( {cur+1, i} ); cur+=2; can.push_back(cur); } add_or( can ); } void subtask_6 ( ) { vector<int> can; vector<int> tmp = r(0); auto cc = c(0); tmp.insert( tmp.end(), all(cc) ); for ( auto& i : tmp) { if ( siz( hi[i] ) == 0 ) continue; add_or( hi[i] ); add_and( {cur+1, i} ); cur+=2; can.push_back(cur); } add_or( can ); } void subtask_7 () { vector<int> rs(h), cs(w); // rs[i] = id of Xor row i, cs[i] = id of Xor col i int nr, nc; // nr -> id of Not(OR(Xor rows)) ,id nc Not(OR(Xor col)) for (int i=0; i<h; i++) { vector<int> tmp = r(i); add_xor( tmp ); rs[i] = ++cur; } for (int i=0; i<w; i++) { vector<int>tmp = c(i); add_xor(tmp); cs[i] = ++cur; } add_or( rs ); add_not(++cur); nr = ++cur; add_or(cs); add_not( ++cur ); nc = ++cur; vector<int> can; for (int i=0; i<h-1; i++) { add_and( {rs[i], rs[i+1], nc} ); can.push_back( ++cur ); } for (int i=0; i<w; i++) { add_and( {cs[i], cs[i+1], nr} ); can.push_back( ++cur ); } add_or(can); } /* add_and(Ns); add_or(Ns); add_xor(Ns); add_not(c); */ void construct_network(int H, int W, int K) { h = H; w = W; k = K; hi = meto(); cur = h*w-1; if ( (max(h, w) > 30) && (k == 1) ) { subtask_7(); return; } if ( max(h, w) > 30 ) { subtask_6(); return; } normal(); }
#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...