Submission #973802

#TimeUsernameProblemLanguageResultExecution timeMemory
973802hirayuu_ojVision Program (IOI19_vision)C++17
100 / 100
21 ms3420 KiB
#include "vision.h"
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define all(x) x.begin(),x.end()
using ll=long long;

int h,w,k;

int pos(int i,int j){
    return i*w+j;
}
int ind(int i){
    return h*w+i;
}

void construct_network(int H, int W, int K) {
    h=H;
    w=W;
    k=K;
    vector<vector<int>> plus(H+W-1);
    rep(i,H){
        rep(j,W){
            plus[i+j].push_back(pos(i,j));
        }
    }
    vector<vector<int>> minus(H+W-1);
    rep(i,H){
        rep(j,W){
            minus[i+(W-j-1)].push_back(pos(i,j));
        }
    }
    int cnt=0;
    vector<int> plus_pos,minus_pos;
    rep(i,H+W-1){
        add_or(plus[i]);
        plus_pos.push_back(ind(cnt));
        cnt++;
    }
    rep(i,H+W-1){
        add_or(minus[i]);
        minus_pos.push_back(ind(cnt));
        cnt++;
    }
    vector<int> wide;
    add_xor(plus_pos);
    wide.push_back(ind(cnt));
    cnt++;
    rep(i,H+W-1-K){
        vector<int> now;
        rep(j,K+1){
            now.push_back(plus_pos[i+j]);
        }
        add_or(now);
        cnt++;
        add_xor(now);
        cnt++;
        add_not(ind(cnt-1));
        cnt++;
        add_and({ind(cnt-3),ind(cnt-1)});
        wide.push_back(ind(cnt));
        cnt++;
    }
    add_or(wide);
    int wp=ind(cnt);
    cnt++;
    wide.clear();
    add_xor(minus_pos);
    wide.push_back(ind(cnt));
    cnt++;
    rep(i,H+W-1-K){
        vector<int> now;
        rep(j,K+1){
            now.push_back(minus_pos[i+j]);
        }
        add_or(now);
        cnt++;
        add_xor(now);
        cnt++;
        add_not(ind(cnt-1));
        cnt++;
        add_and({ind(cnt-3),ind(cnt-1)});
        wide.push_back(ind(cnt));
        cnt++;
    }
    add_or(wide);
    int wm=ind(cnt);
    cnt++;
    add_and({wp,wm});
    int wide_ok=ind(cnt);
    cnt++;
    vector<int> just;
    rep(i,H+W-1-K){
        vector<int> now;
        rep(j,K+1){
            now.push_back(plus_pos[i+j]);
        }
        add_and({now[0],now.back()});
        just.push_back(ind(cnt));
        cnt++;
    }
    rep(i,H+W-1-K){
        vector<int> now;
        rep(j,K+1){
            now.push_back(minus_pos[i+j]);
        }
        add_and({now[0],now.back()});
        just.push_back(ind(cnt));
        cnt++;
    }
    add_or(just);
    int jp=ind(cnt);
    cnt++;
    add_and({wide_ok,jp});
}
#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...