| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 291813 | medmdg | Vision Program (IOI19_vision) | C++14 | 0 ms | 0 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "vision.h"
using namespace std;
void construct_network(int H, int W, int K){
    vector<int> hori;
    vector<int> vert;
    int bh=H*W;
    int eh;
    for(int i=0;i<H;i++){
        vector<int> al;
        for(int j=0;j<W;j++){
            al.push_back(j+i*W);
        }
        eh=add_or(al);
        hori.push_back(eh);
    }
    int bv=eh+1;
    int ev;
    for(int i=0;i<W;i++){
        vector<int> al;
        for(int j=i;j<H*W;j+=W){
            al.push_back(j);
        }
        ev=add_or(al);
        vert.push_back(ev);
    }
    vector<int> dishori;
    vector<int> disvert;
    int end=ev;
    vector<int> 0H;
    for(int i=bh;i<=eh;i++){
        0H.push_back(i);
    }
    dishori.push_back(add_xor(0H));
    vector<int> 0V;
    for(int i=bv;i<=ev;i++){
        0V.push_back(i);
    }
    disvert.push_back(add_xor(0V));
    end+=2;
    for(int i=1;i<=min(H-1,K);i++){
        vector<int> h;
        for(int j=bh;j<=eh-i;j++){
            vector<int> hp;
            hp.push_back(j);
            hp.push_back(j+i);
            end=add_and(hp);
            h.push_back(end);
        }
        if(h.size()){
            dishori.push_back(add_or(h));
            end++;
        }
    }
    for(int i=1;i<=min(W-1,K);i++){
        vector<int> h;
        for(int j=bv;j<=ev-i;j++){
            vector<int> hp;
            hp.push_back(j);
            hp.push_back(j+i);
            end=add_and(hp);
            h.push_back(end);
        }
        if(h.size()){
            disvert;push_back(add_or(h));
            end++;
        }
    }
    int last;
    for(int i=0;i<=K;i++){
        if(disvert.size()>i&&dishori.size()>K-i){
            vector<int> f;
            f.push_back(disvert[i]);
            f.push_back(dishori[K-i]);
            last.push_back(add_and(f));
        }
    }
    vector<int> nb;
    for(int i=end+1;i<=last;i++){
        nb.push_back(i);
    }
    last=add_or(nb);
    return;
}
