제출 #1198600

#제출 시각아이디문제언어결과실행 시간메모리
1198600HappyCapybaraVision Program (IOI19_vision)C++17
100 / 100
11 ms2244 KiB
#include "vision.h" #include<bits/stdc++.h> using namespace std; vector<int> pp; void genpp(){ pp.push_back(1); for (int i=2; i<=200; i++){ bool p = true; for (int j=2; j<min(i, 15); j++){ if (i % j == 0) p = false; } if (p){ int cur = i; while (cur <= 200){ pp.push_back(cur); cur *= i; } } } sort(pp.begin(), pp.end()); } void construct_network(int H, int W, int K) { genpp(); for (int i=0; i<H; i++){ vector<int> v; for (int j=0; j<W; j++) v.push_back(i*W+j); add_or(v); } for (int j=0; j<W; j++){ vector<int> v; for (int i=0; i<H; i++) v.push_back(i*W+j); add_or(v); } int cur = H*W+H+W; map<int,int> rip, cip; for (int p : pp){ if (p > H) break; int start = cur; for (int i=0; i<p; i++){ if (i+p > H) break; vector<int> v; for (int x=i; x<H; x+=p) v.push_back(H*W+x); add_xor(v); cur++; } vector<int> v; for (int x=start; x<cur; x++) v.push_back(x); add_or(v); add_not(cur); cur += 2; rip[p] = cur-1; v.clear(); for (int i=0; i<p; i++){ if (i+p > H) v.push_back(H*W+i); } if (!v.empty()){ add_or(v); add_not(cur); add_and({cur-1, cur+1}); rip[p] = cur+2; cur += 3; } } //cout << cur-H*W << endl; for (int p : pp){ if (p > W) break; int start = cur; for (int i=0; i<p; i++){ if (i+p > W) break; vector<int> v; for (int x=i; x<W; x+=p) v.push_back(H*W+H+x); add_xor(v); cur++; } vector<int> v; for (int x=start; x<cur; x++) v.push_back(x); add_or(v); add_not(cur); cur += 2; cip[p] = cur-1; for (int i=0; i<p; i++){ if (i+p > W) v.push_back(H*W+H+i); } if (!v.empty()){ add_or(v); add_not(cur); add_and({cur-1, cur+1}); cip[p] = cur+2; cur += 3; } } //cout << cur-H*W << endl; vector<int> res; for (int i=1; i<K; i++){ if (i > H-1) break; if (K-i > W-1) continue; vector<int> d, nd; for (int p : pp){ if (p > H) break; if (i % p == 0) d.push_back(rip[p]); else nd.push_back(rip[p]); } add_and(d); add_or(nd); add_not(cur+1); add_and({cur, cur+2}); d.clear(); nd.clear(); for (int p : pp){ if (p > W) break; if ((K-i) % p == 0) d.push_back(cip[p]); else nd.push_back(cip[p]); } add_and(d); add_or(nd); add_not(cur+5); add_and({cur+4, cur+6}); add_and({cur+3, cur+7}); res.push_back(cur+8); cur += 9; } if (K < W){ int x = K; vector<int> d, nd; for (int p : pp){ if (p > W) break; if (x % p == 0) d.push_back(cip[p]); else nd.push_back(cip[p]); } add_and(d); add_or(nd); add_not(cur+1); add_and({cur, cur+2}); vector<int> v; for (int i=0; i<H; i++) v.push_back(H*W+i); add_xor(v); add_and({cur+3, cur+4}); res.push_back(cur+5); cur += 6; } if (K < H){ int x = K; vector<int> d, nd; for (int p : pp){ if (p > H) break; if (x % p == 0) d.push_back(rip[p]); else nd.push_back(rip[p]); } add_and(d); add_or(nd); add_not(cur+1); add_and({cur, cur+2}); vector<int> v; for (int i=0; i<W; i++) v.push_back(H*W+H+i); add_xor(v); add_and({cur+3, cur+4}); res.push_back(cur+5); cur += 6; } //cout << cur-H*W << endl; add_or(res); }
#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...