Submission #1307384

#TimeUsernameProblemLanguageResultExecution timeMemory
1307384_as3adVision Program (IOI19_vision)C++20
32 / 100
864 ms3920 KiB
#include <bits/stdc++.h>
#include "vision.h"
using namespace std;
#define ll long long
//#define int long long
#define all(x) x.begin(), x.end()
#define siz(x) ((int)x.size())
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define f first
#define s second

/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/


const int mod = 1e9+7;
const int N = 20005;
const long long inf = 1e12+12;
double eps = 1e-9;

vector<vector<int>> hi;
int cur;
int h, w, k;


vector<vector<int>> meto ( ) {
    vector<array<int,2>>vect;
    for(int i=0;i<h;++i){
        for(int j=0;j<w;++j){
            vect.push_back({i,j});
        }
    }
    vector<vector<int>> ans( siz(vect)+3 );
    for(int i =0;i<vect.size();++i){
        for(int j =i+1;j<vect.size();++j){
            int sz = abs(vect[i][0]-vect[j][0])+abs(vect[i][1]-vect[j][1]);
            if(sz==k)
                ans[i].push_back(j);
        }
    }
    return ans;
}


vector<int> r(int i) {
    vector<int> ans;
    for (int j=0; j<w; j++) ans.push_back( i*w+j );
    return ans;
}
vector<int> c(int j) {
    vector<int> ans;
    for (int i=0; i<h; i++) ans.push_back( i*w+j );
    return ans;
}

void normal () {
    vector<int> can;
    for (int i=0; i<h*w; i++) {
        if ( siz( hi[i] ) == 0 ) continue;
        add_or( hi[i] );
        add_and( {cur+1, i} );
        cur+=2;
        can.push_back(cur);
    }
    add_or( can );
}

void subtask_6 ( ) {
    vector<int> can;
    vector<int> tmp = r(0);
    auto cc = c(0);
    tmp.insert( tmp.end(), all(cc) );
    for ( auto& i : tmp) {
        if ( siz( hi[i] ) == 0 ) continue;
        add_or( hi[i] );
        add_and( {cur+1, i} );
        cur+=2;
        can.push_back(cur);
    }
    add_or( can );
}

void subtask_7 () {
    vector<int> rs(h), cs(w);  // rs[i] = id of Xor row i, cs[i] = id of Xor col i
    int nr, nc; // nr -> id of Not(OR(Xor rows)) ,id  nc Not(OR(Xor col))
    for (int i=0; i<h; i++) {
        vector<int> tmp = r(i);
        add_xor( tmp );
        rs[i] = ++cur;
    }
    for (int i=0; i<w; i++) {
        vector<int>tmp = c(i);
        add_xor(tmp);
        cs[i] = ++cur;
    }

    add_or( rs );
    add_not(++cur);
    nr = ++cur;

    add_or(cs);
    add_not( ++cur );
    nc = ++cur;
    vector<int> can;
    for (int i=0; i<h-1; i++) {
        add_and( {rs[i], rs[i+1], nc} );
        can.push_back( ++cur );
    }
    for (int i=0; i<w; i++) {
        add_and( {cs[i], cs[i+1], nr} );
        can.push_back( ++cur );
    }
    add_or(can);

}


/*
add_and(Ns);
add_or(Ns);
add_xor(Ns);
add_not(c);
*/

void construct_network(int H, int W, int K) {
    h = H;
    w = W;
    k = K;
	hi = meto();
	cur = h*w-1;


    if ( (max(h, w) > 30) && (k == 1) ) {
        subtask_7();
        return;
    }
    if ( max(h, w) > 30 ) {
        subtask_6();
        return;
    }
    normal();




}
#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...