Submission #603086

#TimeUsernameProblemLanguageResultExecution timeMemory
603086Clan328Vision Program (IOI19_vision)C++17
66 / 100
22 ms2716 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back 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 transformCoords(int W, int i, int j) { return i*W+j; } bool isValid(int H, int W, int i, int j) { if (i < 0 || j < 0 || i >= H || j >= W) return false; return true; } int idx; int calc1(int H, int W) { vector<int> Ns; // int idx = H*W; for (int i = 0; i < H; i++) { vector<int> arr; for (int j = 0; j < W; j++) arr.pb(i*W+j); add_or(arr); idx++; } int og = idx; for (int i = 0; i < H-1; i++) { add_and({og-H+i, og-H+i+1}); Ns.pb(idx); idx++; } int consecOr1 = add_or(Ns); idx++; Ns = vector<int>(); for (int i = 0; i < W; i++) { vector<int> arr; for (int j = 0; j < H; j++) arr.pb(j*W+i); add_or(arr); add_xor(arr); add_xor({idx, idx+1}); Ns.pb(idx+2); idx+=3; } int consecXor1 = add_or(Ns); // for (int i = 0; i < Ns.size(); i++) cout << Ns[i] << " "; // cout << endl; idx += 2; return add_and({consecOr1, consecXor1}); } int calc2(int H, int W) { vector<int> Ns; // int idx = H*W; for (int i = 0; i < W; i++) { vector<int> arr; for (int j = 0; j < H; j++) arr.pb(j*W+i); add_or(arr); idx++; } int og = idx; for (int i = 0; i < W-1; i++) { add_and({og-W+i, og-W+i+1}); Ns.pb(idx); idx++; } int consecOr1 = add_or(Ns); idx++; Ns = vector<int>(); for (int i = 0; i < H; i++) { vector<int> arr; for (int j = 0; j < W; j++) arr.pb(i*W+j); add_or(arr); add_xor(arr); add_xor({idx, idx+1}); Ns.pb(idx+2); idx+=3; } int consecXor1 = add_or(Ns); idx += 2; return add_and({consecOr1, consecXor1}); } void construct_network(int H, int W, int K) { if (min(H, W) <= 30) { vector<int> Ns; int idx = 0; for (int x = 0; x < H; x++) { for (int y = 0; y < W; y++) { vector<int> arr; for (int i = 0; i <= K; i++) { if (isValid(H, W, i+x, K-i+y)) { arr.pb(transformCoords(W, i+x, K-i+y)); } if (isValid(H, W, x-i, K-i+y) && x-i != i+x) { arr.pb(transformCoords(W, x-i, K-i+y)); } } if (arr.size()) { add_or({transformCoords(W, x, y)}); add_or(arr); idx += 2; } } } // for (int i = 0; i < Ns.size(); i++) { // cout << Ns[i] << " x "; // } // cout << endl; for (int i = 0; i < idx; i+=2) { Ns.pb(add_and({H*W+i, H*W+i+1})); } add_or(Ns); return; } else if (K == 1) { idx = H*W; add_or({calc1(H, W) , calc2(H, W)}); } else { vector<int> Ns; int idx = 0; for (int i = 0; i <= K; i++) { if (!isValid(H, W, i, K-i)) continue; add_and({0, transformCoords(W, i, K-i)}); Ns.pb(H*W+idx); idx++; } add_or(Ns); } // cout << idx << endl; }
#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...