Submission #813259

#TimeUsernameProblemLanguageResultExecution timeMemory
813259physics07Vision Program (IOI19_vision)C++17
100 / 100
15 ms2244 KiB
#include "vision.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; int dis(int x, int y, int a, int b) { return abs(x-a)+abs(y-b); } int w; int num(int x, int y) { return x*w+y; } int locknum[2], row, col; pair<int, int> calc(pair<int, int> prv, int curr) { vector<int> v; v={curr, prv.first}; pair<int, int> on={add_and(v), 0}; on.second=on.first; for(int i=prv.first+1; i<=min(prv.second, prv.first+8); i++) { v={on.second, i}; on.second=add_and(v); } v={prv.first, curr}; pair<int, int> res={add_xor(v), 0}; res.second=res.first; for(int i=prv.first+1, j=on.first; j<=on.second; i++, j++) { if(i>prv.second) v={locknum[0], j}; else v={i, j}; res.second=add_xor(v); } return res; } void construct_network(int n, int m, int k) { vector<int> v; w=m; for(int i=0; i<n; i++) for(int j=0; j<m; j++) v.push_back(num(i, j)); locknum[1]=add_or(v); locknum[0]=add_not(locknum[1]); v.clear(); int s=locknum[0]+1, e=locknum[0]+1; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) v.push_back(num(i, j)); e=add_or(v); v.clear(); } for(int i=s; i<=e; i++) v.push_back(i); int state=add_xor(v); state=add_not(state); v={locknum[0], s}; row=add_xor(v); v.clear(); for(int i=s+1; i<=e; i++) { v={row+i-s-1, i}; add_xor(v); } for(int i=0; i<n; i++) { v={row+i, state}; add_and(v); } v.clear(); row+=n; s=row+n; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) v.push_back(num(j, i)); e=add_or(v); v.clear(); } for(int i=s; i<=e; i++) v.push_back(i); state=add_xor(v); state=add_not(state); v={locknum[0], s}; col=add_xor(v); for(int i=s+1; i<=e; i++) { v={col+i-s-1, i}; add_xor(v); } for(int i=0; i<m; i++) { v={col+i, state}; add_and(v); } col+=m; v.clear(); for(int i=0; i<n; i++) v.push_back(row+i); for(int i=0; i<m; i++) v.push_back(col+i); pair<int, int> res={locknum[0], locknum[0]}; for(auto i: v) res=calc(res, i); v={locknum[0]}; while(res.second<res.first+9) res.second=add_and(v); pair<int, int> digit={res.second+1, res.second+1}; for(int i=0; i<10; i++) { v={locknum[!!(k&1<<i)], res.first+i}; digit.second=add_xor(v); } v.clear(); for(int i=digit.first; i<=digit.second; i++) v.push_back(i); int ans=add_or(v); add_not(ans); }
#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...