Submission #1189492

#TimeUsernameProblemLanguageResultExecution timeMemory
1189492alexddVision Program (IOI19_vision)C++20
100 / 100
13 ms2548 KiB
#include <bits/stdc++.h>
#include "vision.h"
using namespace std;

void construct_network(int H, int W, int K)
{
    vector<int> linii,coloane;
    vector<int> sus(H+2),jos(H+2);
    vector<int> st(W+2),dr(W+2);

    for(int lin=0;lin<H;lin++)
    {
        vector<int> aux;
        if(lin-1 >= 0)
            aux.push_back(sus[lin-1]);
        for(int i=0;i<W;i++)
            aux.push_back(lin*W+i);
        sus[lin] = add_or(aux);
    }
    for(int lin=H-1;lin>=0;lin--)
    {
        vector<int> aux;
        if(lin+1 < H)
            aux.push_back(jos[lin+1]);
        for(int i=0;i<W;i++)
            aux.push_back(lin*W+i);
        jos[lin] = add_or(aux);
    }

    for(int lin=1;lin<H;lin++)
    {
        linii.push_back(add_and({sus[lin-1],jos[lin]}));
    }

    for(int col=0;col<W;col++)
    {
        vector<int> aux;
        if(col-1 >= 0)
            aux.push_back(st[col-1]);
        for(int i=0;i<H;i++)
            aux.push_back(i*W+col);
        st[col] = add_or(aux);
    }
    for(int col=W-1;col>=0;col--)
    {
        vector<int> aux;
        if(col+1 < W)
            aux.push_back(dr[col+1]);
        for(int i=0;i<H;i++)
            aux.push_back(i*W+col);
        dr[col] = add_or(aux);
    }
    for(int col=1;col<W;col++)
    {
        coloane.push_back(add_and({st[col-1],dr[col]}));
    }

    vector<int> combinat;
    for(int x:linii)
        combinat.push_back(x);
    for(int x:coloane)
        combinat.push_back(x);

    int zero = add_and({combinat[0],add_not(combinat[0])});

    vector<int> cnt;
    for(int lun=0;(1<<lun)<=(H+W-2);lun++)
        cnt.push_back(zero);
    //for(int x:cnt) cerr<<x<<" zzz\n";
    for(int x:combinat)
    {
        vector<int> newcnt;
        int pref = x;
        for(int i=0;i<cnt.size();i++)
        {
            newcnt.push_back(add_xor({pref,cnt[i]}));
            pref = add_and({pref,cnt[i]});
        }
        cnt = newcnt;
    }

    vector<int> rez;
    for(int i=0;i<cnt.size();i++)
        if((1<<i)&K)
            rez.push_back(cnt[i]);
        else
            rez.push_back(add_not(cnt[i]));

    add_and(rez);
}
/*

2 2 1
0 0 1 1
0 0 0 1
0 0 1 0
-1

2 3 3
0 0 1 2
1 0 0 2
0 0 1 1
-1




*/
#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...