Submission #425014

#TimeUsernameProblemLanguageResultExecution timeMemory
425014oleh1421Vision Program (IOI19_vision)C++17
58 / 100
13 ms1224 KiB
//#include "grader.cpp"

#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void construct_network(int H, int W, int K) {
    int ind=H*W-1;
    vector<int>r,c;
    for (int i=0;i<H;i++){
        vector<int>v;
        for (int j=0;j<W;j++) v.push_back(i*W+j);
        add_xor(v);
        ind++;
        r.push_back(ind);
    }
    for (int i=0;i<W;i++){
        vector<int>v;
        for (int j=0;j<H;j++) v.push_back(j*W+i);
        add_xor(v);
        ind++;
        c.push_back(ind);
    }
    vector<int>ans;
    for (int dx=max(1,K-W+1);dx<=min(K-1,H-1);dx++){
        int dy=K-dx;
        vector<int>A;
        for (int i=0;i+dx<H;i++){
            add_and({r[i],r[i+dx]});
            ind++;
            A.push_back(ind);
        }
        vector<int>B;
        for (int i=0;i+dy<W;i++){
            add_and({c[i],c[i+dy]});
            ind++;
            B.push_back(ind);
        }
        add_or(A);
        int orA=++ind;
        add_or(B);
        int orB=++ind;
        add_and({orA,orB});
        ans.push_back(++ind);
    }
    if (K<H){
        vector<int>A;
        for (int i=0;i+K<H;i++){
            add_and({r[i],r[i+K]});
            ind++;
            A.push_back(ind);
        }
        add_or(A);
        int orA=++ind;
        add_or(c);
        ind++;
        add_not(ind);
        int orB=++ind;
        add_and({orA,orB});
        ans.push_back(++ind);
    }
    if (K<W){
        vector<int>A;
        for (int i=0;i+K<W;i++){
            add_and({c[i],c[i+K]});
            ind++;
            A.push_back(ind);
        }
        add_or(A);
        int orA=++ind;
        add_or(r);
        ind++;
        add_not(ind);
        int orB=++ind;
        add_and({orA,orB});
        ans.push_back(++ind);
    }
    add_or(ans);
    ind++;
//    if (K==1){
//        vector<int>c,r;
//
//    }
//    vector<int>v;
//    for (int i=0;i<H;i++){
//        for (int j=0;j<W;j++){
//            if (H*W>=5000 && (i || j)) continue;
//            vector<int>Ask;
//            for (int x=0;x<=K;x++){
//                int y=K-x;
//                for (int dx:{-1,1}){
//                    for (int dy:{-1,1}){
//                        int nx=i+x*dx,ny=j+y*dy;
//                        if (nx<0 || nx>=H || ny<0 || ny>=W) continue;
//                        Ask.push_back(nx*W+ny);
//                    }
//                }
//            }
//            if (!Ask.empty()){
//                add_or(Ask);
//                ind++;
//                add_and({ind,i*W+j});
//                ind++;
//                v.push_back(ind);
//            }
//        }
//    }
//    add_or(v);
}
/**
2 3 3
0 0 0 1
0 0 0 2
0 0 1 0
0 0 1 1
0 0 1 2
0 1 0 2
0 1 1 0
0 1 1 1
0 1 1 2
0 2 1 0
0 2 1 1
0 2 1 2
1 0 1 1
1 0 1 2
1 1 1 2
-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...