Submission #599265

#TimeUsernameProblemLanguageResultExecution timeMemory
599265FatihSolakVision Program (IOI19_vision)C++17
32 / 100
8 ms1360 KiB
#include "vision.h" #include <bits/stdc++.h> using namespace std; int h,w,k; int get_pos(int x,int y){ return x*w + y; } void construct_network(int H, int W, int K) { h = H; w = W; k = K; map<int,int> row,col; int cnt = h*w; add_not(0); cnt++; add_or({0,cnt-1}); int pos_1 = cnt++; for(int i = 0;i<h;i++){ vector<int> v; for(int j = 0;j<w;j++){ v.push_back(get_pos(i,j)); } add_or(v); row[i] = cnt++; } for(int i = 0;i<w;i++){ vector<int> v; for(int j = 0;j<h;j++){ v.push_back(get_pos(j,i)); } add_or(v); col[i] = cnt++; } map<int,int> row_dif,col_dif; for(int i = h-1;i>0;i--){ vector<int> candidates; set<int> s; for(int j = 0;j<h;j++){ if(j + i < h){ s.insert(j); } } while(s.size()){ int last = 0; vector<int> ask1; vector<int> ask2; vector<int> nums; while(1){ if(s.lower_bound(last) == s.end())break; int num = *s.lower_bound(last); s.erase(num); nums.push_back(num); ask1.push_back(row[num]); ask2.push_back(row[num + i]); last = num + 2*i; } if(nums.size() > 2){ add_or(ask1); int ps1 = cnt++; add_or(ask2); int ps2 = cnt++; add_and({ps1,ps2}); candidates.push_back(cnt++); } else{ for(auto u:nums){ vector<int> ask1; int num = u; ask1.push_back(row[num]); ask1.push_back(row[num + i]); add_and(ask1); candidates.push_back(cnt++); } } } add_or(candidates); int now = cnt++; if(i != h-1){ candidates.clear(); for(int j = i + 1;j<h;j++){ candidates.push_back(row_dif[j]); } add_or(candidates); int highers = cnt++; add_not(highers); int not_highers = cnt++; candidates = {now,not_highers}; add_and(candidates); row_dif[i] = cnt++; } else{ row_dif[i] = now; } } vector<int> tmp; for(int i = 1;i<h;i++){ tmp.push_back(row_dif[i]); } if(h > 1){ add_or(tmp); int ps = cnt++; add_not({ps}); row_dif[0] = cnt++; } else{ add_or({pos_1}); row_dif[0] = cnt++; } for(int i = w-1;i>0;i--){ vector<int> candidates; set<int> s; for(int j = 0;j<w;j++){ if(j + i < w){ s.insert(j); } } while(s.size()){ int last = 0; vector<int> ask1; vector<int> ask2; while(1){ if(s.lower_bound(last) == s.end())break; int num = *s.lower_bound(last); s.erase(num); ask1.push_back(col[num]); ask1.push_back(col[num + i]); ask1.push_back(col[num + i]); ask2.push_back(col[num]); ask2.push_back(col[num]); ask2.push_back(col[num + i]); last = num + 2*i; } add_xor(ask1); int ps1 = cnt++; add_xor(ask2); int ps2 = cnt++; add_and({ps1,ps2}); candidates.push_back(cnt++); } add_or(candidates); int now = cnt++; if(i != w-1){ candidates.clear(); for(int j = i + 1;j<w;j++){ candidates.push_back(col_dif[j]); } add_or(candidates); int highers = cnt++; add_not(highers); int not_highers = cnt++; candidates = {now,not_highers}; add_and(candidates); col_dif[i] = cnt++; } else{ col_dif[i] = now; } } tmp.clear(); for(int i = 1;i<w;i++){ tmp.push_back(col_dif[i]); } if(w > 1){ add_or(tmp); int ps = cnt++; add_not({ps}); col_dif[0] = cnt++; } else{ add_or({pos_1}); col_dif[0] = cnt++; } vector<int> candidates; for(int i = 0;i<=min(h-1,k);i++){ if(0 <= k-i && k-i < w){ add_and({row_dif[i],col_dif[k-i]}); candidates.push_back(cnt++); } } add_or(candidates); int answer = cnt++; }

Compilation message (stderr)

vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:183:6: warning: unused variable 'answer' [-Wunused-variable]
  183 |  int answer = cnt++;
      |      ^~~~~~
#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...