Submission #1158672

#TimeUsernameProblemLanguageResultExecution timeMemory
1158672emptypringlescanVision Program (IOI19_vision)C++20
100 / 100
33 ms5192 KiB
#include <bits/stdc++.h> using namespace std; #include "vision.h" // B = H+W-1, diagonal /, diagonal2 \ // 0 , H*W-1 // H*W , H*W + B - 1 -> diagonal or // H*W + B, H*W + 2B - 1 -> diagonal2 or // H*W + 2B, H*W + 3B - 1 -> and of 2 diagonals // H*W + 3B, H*W + 4B - 1 -> and of 2 diagonals2 // H*W + 4B, H*W + 5B - 1 -> diagonal xor // H*W + 5B, H*W + 6B - 1 -> diagonal2 xor // H*W + 6B, H*W + 7B - 1 -> or of k+1 diagonals or // H*W + 7B, H*W + 8B - 1 -> or of k+1 diagonals2 or // H*W + 8B, H*W + 9B - 1 -> k+1 diagonals or xor k+1 diagonals xor // H*W + 9B, H*W + 10B - 1 -> k+1 diagonals2 or xor k+1 diagonals2 xor // H*W + 10B -> or of [H*W + 2B, H*W + 3B - 1 - K] // H*W + 10B + 1 -> or of [H*W + 3B, H*W + 4B - 1 - K] // H*W + 10B + 2 -> or of [H*W + 8B, H*W + 9B - 1] // H*W + 10B + 3 -> or of [H*W + 9B, H*W + 10B - 1] // H*W + 10B + 4 -> H*W + 10B and H*W + 10B + 3 // H*W + 10B + 5 -> H*W + 10B + 1 and H*W + 10B + 2 // H*W + 10B + 6 -> H*W + 10B + 4 or H*W + 10B + 5 void construct_network(int h, int w, int k){ vector<int> lol; int b=h+w-1; // H*W , H*W + B - 1 -> diagonal or for(int i=0; i<b; i++){ lol.clear(); pair<int,int> cur={max(0,i-w+1),min(w-1,i)}; while(cur.first<h&&cur.second>=0){ lol.push_back(cur.first*w+cur.second); cur.first++; cur.second--; } add_or(lol); } // H*W + B, H*W + 2B - 1 -> diagonal2 or for(int i=0; i<b; i++){ lol.clear(); pair<int,int> cur={max(0,h-i-1),max(0,i-h+1)}; while(cur.first<h&&cur.second<w){ lol.push_back(cur.first*w+cur.second); cur.first++; cur.second++; } add_or(lol); } // H*W + 2B, H*W + 3B - 1 -> and of 2 diagonals for(int i=0; i<b; i++){ lol.clear(); lol.push_back(h*w+i); if(i+k<b) lol.push_back(h*w+i+k); add_and(lol); } // H*W + 3B, H*W + 4B - 1 -> and of 2 diagonals2 for(int i=0; i<b; i++){ lol.clear(); lol.push_back(h*w+b+i); if(i+k<b) lol.push_back(h*w+b+i+k); add_and(lol); } // H*W + 4B, H*W + 5B - 1 -> diagonal xor for(int i=0; i<b; i++){ lol.clear(); pair<int,int> cur={max(0,i-w+1),min(w-1,i)}; while(cur.first<h&&cur.second>=0){ lol.push_back(cur.first*w+cur.second); cur.first++; cur.second--; } add_xor(lol); } // H*W + 5B, H*W + 6B - 1 -> diagonal2 xor for(int i=0; i<b; i++){ lol.clear(); pair<int,int> cur={max(0,h-i-1),max(0,i-h+1)}; while(cur.first<h&&cur.second<w){ lol.push_back(cur.first*w+cur.second); cur.first++; cur.second++; } add_xor(lol); } // H*W + 6B, H*W + 7B - 1 -> or of k+1 diagonals or for(int i=0; i<b; i++){ lol.clear(); for(int j=0; j<=k; j++){ if(i+j>=b) break; lol.push_back(h*w+i+j); } add_or(lol); } // H*W + 7B, H*W + 8B - 1 -> or of k+1 diagonals2 or for(int i=0; i<b; i++){ lol.clear(); for(int j=0; j<=k; j++){ if(i+j>=b) break; lol.push_back(h*w+b+i+j); } add_or(lol); } // H*W + 8B, H*W + 9B - 1 -> k+1 diagonals or xor k+1 diagonals xor for(int i=0; i<b; i++){ lol.clear(); lol.push_back(h*w+6*b+i); for(int j=0; j<=k; j++){ if(i+j>=b) break; lol.push_back(h*w+4*b+i+j); } add_xor(lol); } // H*W + 9B, H*W + 10B - 1 -> k+1 diagonals2 or xor k+1 diagonals2 xor for(int i=0; i<b; i++){ lol.clear(); lol.push_back(h*w+7*b+i); for(int j=0; j<=k; j++){ if(i+j>=b) break; lol.push_back(h*w+5*b+i+j); } add_xor(lol); } // H*W + 10B -> or of [H*W + 2B, H*W + 3B - 1 - K] lol.clear(); for(int i=h*w+2*b; i<=h*w+3*b-1-k; i++) lol.push_back(i); add_or(lol); // H*W + 10B + 1 -> or of [H*W + 3B, H*W + 4B - 1 - K] lol.clear(); for(int i=h*w+3*b; i<=h*w+4*b-1-k; i++) lol.push_back(i); add_or(lol); // H*W + 10B + 2 -> or of [H*W + 8B, H*W + 9B - 1] lol.clear(); for(int i=h*w+8*b; i<=h*w+9*b-1; i++) lol.push_back(i); add_or(lol); // H*W + 10B + 3 -> or of [H*W + 9B, H*W + 10B - 1] lol.clear(); for(int i=h*w+9*b; i<=h*w+10*b-1; i++) lol.push_back(i); add_or(lol); // H*W + 10B + 4 -> H*W + 10B and H*W + 10B + 3 add_and({h*w+10*b,h*w+10*b+3}); // H*W + 10B + 5 -> H*W + 10B + 1 and H*W + 10B + 2 add_and({h*w+10*b+1,h*w+10*b+2}); // H*W + 10B + 6 -> H*W + 10B + 4 or H*W + 10B + 5 add_or({h*w+10*b+4,h*w+10*b+5}); }
#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...