Submission #1071261

#TimeUsernameProblemLanguageResultExecution timeMemory
1071261LittleOrangeVision Program (IOI19_vision)C++17
100 / 100
28 ms3044 KiB
#include "vision.h" #include<bits/stdc++.h> using namespace std; using ll = int; const ll big = 1e9; ll any_one(const vector<ll> &v){ return v.size()==1?v[0]:add_or(v); } ll do_nxor(const vector<ll> &v){ return add_not(v.size()==1?v[0]:add_xor(v)); } void construct_network(int H, int W, int K) { ll h = H; ll w = W; ll k = K; vector<ll> segs1,segs2,two1,two2; for(ll i = 0;i<h+w-1;i++){ vector<ll> v; for(ll x = 0;x<h;x++){ ll y = i-x; if (y>=0&&y<w) v.push_back(x*w+y); } //cerr << "seg1:";for(ll i : v) cerr << " " << i; cerr << "\n"; ll g = any_one(v); segs1.push_back(g); two1.push_back(add_and({g,do_nxor(v)})); } for(ll i = 0;i<h+w-1;i++){ vector<ll> v; for(ll x = 0;x<h;x++){ ll y = i+x-h+1; if (y>=0&&y<w) v.push_back(x*w+y); } //cerr << "seg2:";for(ll i : v) cerr << " " << i; cerr << "\n"; ll g = any_one(v); segs2.push_back(g); two2.push_back(add_and({g,do_nxor(v)})); } //cerr << "cp1\n"; vector<ll> gp1,gp2,sm1,sm2; for(ll i = 0;i<h+w-k-1;i++){ gp1.push_back(add_and({segs1[i],segs1[i+k]})); } for(ll i = 0;i<h+w-k-1;i++){ gp2.push_back(add_and({segs2[i],segs2[i+k]})); } for(ll i = 0;i<h+w-1;i++){ vector<ll> v; for(ll j = k;j>=0;j-=2){ if (i+j>=h+w-1) continue; if (j==0) v.push_back(two1[i]); else v.push_back(segs1[i+j]); } if (v.empty()) continue; sm1.push_back(add_and({segs1[i],any_one(v)})); } for(ll i = 0;i<h+w-1;i++){ vector<ll> v; for(ll j = k;j>=0;j-=2){ if (i+j>=h+w-1) continue; if (j==0) v.push_back(two2[i]); else v.push_back(segs2[i+j]); } if (v.empty()) continue; sm2.push_back(add_and({segs2[i],any_one(v)})); } //cerr << "cp2\n"; ll res1 = any_one(gp1); ll res2 = any_one(gp2); ll sms1 = any_one(sm1); ll sms2 = any_one(sm2); ll gg1 = add_and({res1,sms2}); ll gg2 = add_and({res2,sms1}); add_or({gg1,gg2}); /*std::vector<int> Ns; Ns = {0, 1}; int a = add_and(Ns); Ns = {0, a}; int b = add_or(Ns); Ns = {0, 1, b}; int c = add_xor(Ns); add_not(c);*/ /*vector<vector<ll>> asks(H*W); for(ll x1 = 0;x1<h;x1++){ for(ll y1 = 0;y1<w;y1++){ for(ll x2 = 0;x2<h;x2++){ for(ll y2 = 0;y2<w;y2++){ ll i1 = x1*w+y1; ll i2 = x2*w+y2; if (i1>=i2) continue; if (abs(x1-x2)+abs(y1-y2)!=k) continue; asks[i1].push_back(i2); } } } } vector<ll> outs; for(ll i = 0;i<h*w;i++){ if (asks[i].empty()) continue; ll x = add_or(asks[i]); //cerr << "add_or:"; for(ll j : asks[i]) cerr << " " << j;cerr << " -> " << x << "\n"; //cerr << "add_and: " << i << " " << x << "\n"; outs.push_back(add_and({i,x})); } add_or(outs);*/ }
#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...