Submission #626186

#TimeUsernameProblemLanguageResultExecution timeMemory
626186TimDeeVision Program (IOI19_vision)C++17
0 / 100
11 ms1488 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;

void construct_network(int h, int w, int k) {

    if (h*w==2) {
        if (k==1) add_and({0,1});
        else add_xor({0,1});
        return;
    }

    int zero = add_and({0,1,2});
    int one = add_not(zero);

    vector<int> row(h,0);
    vector<int> col(w,0);

    for (int i=0; i<h; ++i) {
        vector<int> a;
        for (int j=0; j<w; ++j) {
            a.push_back(i*w+j);
        }
        row[i]=add_xor(a);
    }
    for (int j=0; j<w; ++j) {
        vector<int> a;
        for (int i=0; i<h; ++i) {
            a.push_back(i*w+j);
        }
        col[j]=add_xor(a);
    }
    int _check1 = add_or(row), _check2 = add_or(col);
    int check1 = add_not(_check1), check2 = add_not(_check2);
    vector<int> row_k={zero}, col_k={zero};
    for (int j=0; j+k<w; ++j) col_k.push_back(add_and({col[j],col[j+k]}));
    for (int i=0; i+k<h; ++i) row_k.push_back(add_and({row[i],row[i+k]}));

    int _a1=add_or(col_k), _a2=add_or(row_k);
    int inSameRow=add_and({check1,_a1}), inSameCol=add_and({check2,_a2});

    vector<int> prefRow, sufRow, prefCol, sufCol;
    prefRow={row[0]};
    for (int i=1; i<h; ++i) {
        prefRow.push_back(add_xor({row[i],prefRow[i-1]}));
    }
    sufRow={row[h-1]};
    for (int i=h-2; i>=0; --i) {
        sufRow.push_back(add_xor({row[i],sufRow[h-2-i]}));
    }
    prefCol={col[0]};
    for (int i=1; i<w; ++i) {
        prefCol.push_back(add_xor({col[i],prefCol[i-1]}));
    }
    sufCol={col[w-1]};
    for (int i=w-2; i>=0; --i) {
        sufCol.push_back(add_xor({col[i],sufCol[w-2-i]}));
    }

    vector<int> bitxl, bityl, bitxr, bityr;
    vector<int> rl(h), cl(w), rr(h), cr(w);

    for (int i=0; i<h; ++i) {
        //cout<<"PrefRow\n";
        int p=add_and({i?prefRow[i-1]:zero,(i<(h-1))?prefRow[i+1]:zero});
        int q=add_xor({p,prefRow[i],i?prefRow[i-1]:zero});
        int t=add_not(p);
        rl[i]=add_and({q,prefRow[i],t});
    }
    for (int i=0; i<h; ++i) {
        //cout<<"SufRow\n";
        int p=add_and({i?sufRow[i-1]:zero,(i<(h-1))?sufRow[i+1]:zero});
        int q=add_xor({p,sufRow[i],i?sufRow[i-1]:zero});
        int t=add_not(p);
        rr[h-1-i]=add_and({q,sufRow[i],t});
    }
    for (int i=0; i<w; ++i) {
        //cout<<"PrefCol\n";
        int p=add_and({i?prefCol[i-1]:zero,(i<(w-1))?prefCol[i+1]:zero});
        int q=add_xor({p,prefCol[i],i?prefCol[i-1]:zero});
        int t=add_not(p);
        cl[i]=add_and({q,prefCol[i],t});
    }
    for (int i=0; i<w; ++i) {
        //cout<<"SufCol\n";
        int p=add_and({i?sufCol[i-1]:zero,(i<(w-1))?sufCol[i+1]:zero});
        int q=add_xor({p,sufCol[i],i?sufCol[i-1]:zero});
        int t=add_not(p);
        cr[w-1-i]=add_and({q,sufCol[i],t});
    }

    for (int i=0; (1<<i)<h; ++i) {
        vector<int> a;
        for (int x=0; x<h; ++x) {
            if ((x>>i) & 1) a.push_back(rl[x]);
        }
        bitxl.push_back(add_or(a));
    } //for (auto x:bitxl) cout<<x<<' '; cout<<'\n';
    for (int i=0; (1<<i)<w; ++i) {
        vector<int> a;
        for (int x=0; x<w; ++x) {
            if ((x>>i) & 1) a.push_back(cl[x]);
        }
        bityl.push_back(add_or(a));
    } //for (auto x:bityl) cout<<x<<' '; cout<<'\n';
    for (int i=0; (1<<i)<h; ++i) {
        vector<int> a;
        for (int x=0; x<h; ++x) {
            if ((x>>i) & 1) a.push_back(rr[x]);
        }
        bitxr.push_back(add_or(a));
    } //for (auto x:bitxr) cout<<x<<' '; cout<<'\n';
    for (int i=0; (1<<i)<w; ++i) {
        vector<int> a;
        for (int x=0; x<w; ++x) {
            if ((x>>i) & 1) a.push_back(cr[x]);
        }
        bityr.push_back(add_or(a));
    } //for (auto x:bityr) cout<<x<<' '; cout<<'\n';

    vector<int> xorx(10,zero),xory(10,zero),ansbitx(10,zero),ansbity(10,zero),ansbit(10,zero);
    for (int i=0; (1<<i)<h; ++i) {
        xorx[i]=add_xor({bitxl[i],bitxr[i]});
    }
    for (int i=0; (1<<i)<w; ++i) {
        xory[i]=add_xor({bityl[i],bityr[i]});
    }
    ansbitx[0]=xorx[0];
    ansbity[0]=xory[0];
    for (int i=1; (1<<i)<h; ++i) {
        int q=add_not(bitxr[i-1]);
        int p=add_and({xorx[i-1],q});
        ansbitx[i]=add_xor({ansbitx[i],p});
    } //for (auto x:ansbitx) cout<<x<<' '; cout<<'\n';
    for (int i=1; (1<<i)<w; ++i) {
        int q=add_not(bityr[i-1]);
        int p=add_and({ansbity[i-1],q});
        ansbity[i]=add_xor({xory[i],p});
    } //for (auto x:ansbity) cout<<x<<' '; cout<<'\n';

    vector<int> xorans(10,zero);
    for (int i=0; i<10; ++i) xorans[i]=add_xor({ansbity[i],ansbitx[i]});

    ansbit[0]=xorans[0];
    for (int i=1; i<10; ++i) {
        int p=add_and({ansbitx[i-1],ansbity[i-1]});
        int q=add_or({ansbitx[i-1],ansbity[i-1]});
        int t=add_xor({q,ansbit[i-1]});
        int z=add_and({t,q});
        int o=add_or({p,z});
        ansbit[i]=add_xor({xorans[i],o});
    }   

    vector<int> forans;
    for (int i=0; i<10; ++i) {

        if (k&(1<<i)) forans.push_back(ansbit[i]);
        else {
            int v=add_not(ansbit[i]);
            forans.push_back(v);
        }

    }
    int ans=add_and(forans);
    add_or({ans,inSameCol,inSameRow});

}

Compilation message (stderr)

vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:14:9: warning: unused variable 'one' [-Wunused-variable]
   14 |     int one = add_not(zero);
      |         ^~~
#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...