Submission #1165301

#TimeUsernameProblemLanguageResultExecution timeMemory
1165301AlgorithmWarriorVision Program (IOI19_vision)C++20
100 / 100
9 ms1728 KiB
#include <bits/stdc++.h>
#include "vision.h"

using namespace std;

int ind(int lin,int col,int W){
    return lin*W+col;
}

vector<int>coord(int l1,int l2,int c1,int c2,int W){
    vector<int>coor;
    int i,j;
    for(i=l1;i<=l2;++i)
        for(j=c1;j<=c2;++j)
            coor.push_back(ind(i,j,W));
    return coor;
}

int nrbiti(int x){
    int nrb=0;
    while(x){
        x/=2;
        ++nrb;
    }
    return nrb;
}

int pos_unu;
int pos_zero;

vector<int>upgrade(vector<int>oldcount,int nr,int add){
    int nrb=nrbiti(nr);
    vector<int>pref;
    vector<int>change;
    vector<int>counter;
    pref.push_back(pos_unu);
    int i;
    for(i=1;i<nrb;++i)
        pref.push_back(add_and({pref[i-1],oldcount[i-1]}));
    for(i=0;i<nrb;++i)
        change.push_back(add_and({add,pref[i]}));
    if(!(nr&(nr-1)))
        oldcount.push_back(pos_zero);
    for(i=0;i<nrb;++i)
        counter.push_back(add_xor({oldcount[i],change[i]}));
    return counter;
}

void construct_network(int H, int W, int K) {
    vector<int>interes;
    int i;
    interes.push_back(add_xor(coord(0,0,0,W-1,W)));
    for(i=1;i<H;++i){
        vector<int>ask=coord(i,i,0,W-1,W);
        ask.push_back(interes.back());
        interes.push_back(add_xor(ask));
    }
    interes.push_back(add_xor(coord(0,H-1,0,0,W)));
    for(i=1;i<W;++i){
        vector<int>ask=coord(0,H-1,i,i,W);
        ask.push_back(interes.back());
        interes.push_back(add_xor(ask));
    }
    pos_unu=add_or(interes);
    pos_zero=add_and(interes);
    vector<int>counter;
    counter.push_back(interes[0]);
    for(i=1;i<H+W;++i)
        counter=upgrade(counter,i+1,interes[i]);
    int nrb=nrbiti(H+W);
    for(i=0;i<nrb;++i)
        if(!(K&(1<<i)))
            counter[i]=add_not(counter[i]);
    add_and(counter);
}
#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...