Submission #416253

#TimeUsernameProblemLanguageResultExecution timeMemory
416253idk321Vision Program (IOI19_vision)C++17
58 / 100
65 ms5596 KiB
#include "vision.h"

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

int h, w, k;

void construct_network(int H, int W, int K) {
    h = H;
    w = W;
    k = K;

    int level = h * w;
    int hnorm = level;
    for (int i = 0; i < h; i++)
    {
        vector<int> cur;
        for (int j = 0; j < w; j++)
        {
            cur.push_back(i * w + j);
        }
        add_or(cur);
        level++;
    }
    int wnorm = level;
    for (int j = 0; j < w; j++)
    {
        vector<int> cur;
        for (int i = 0; i < h; i++)
        {
            cur.push_back(i * w + j);

        }
        add_or(cur);
        level++;

    }

    int xorh = level;
    vector<int> cur;
    for (int i = 0; i <h; i++)
    {
        cur.push_back(hnorm + i);
        add_xor(cur);
        level++;
    }
    cur.clear();
    int xorw = level;
    for (int j = 0; j < w; j++)
    {
        cur.push_back(wnorm + j);
        add_xor(cur);
        level++;
    }
    cur.clear();


    vector<int> toCheck;

    int notXorh = level;
    for (int i = 0; i< h; i++)
    {
        add_not(xorh + i);
        level++;
    }
    int notXorw = level;
    for (int i = 0; i  < w; i++)
    {
        add_not(xorw + i);
        level++;
    }

    if (k <= h)
    {
        for (int i = 0; i + k  <= h; i++)
        {
            toCheck.push_back(level);
            for (int j = 0; j < h; j++)
            {
                if (j >= i && j < i + k)cur.push_back(xorh + j);
                else cur.push_back(notXorh + j);
            }
            cur.push_back(xorw + w - 1);
            add_and(cur);
            level++;
            cur.clear();
        }
    }

    if (k <= w)
    {
        for (int i = 0; i + k <= w; i++)
        {
            toCheck.push_back(level);

            for (int j = 0; j < w; j++)
            {
                if (j >= i && j < i + k)cur.push_back(xorw + j);
                else cur.push_back(notXorw + j);
            }
            cur.push_back(xorh + h - 1);
            add_and(cur);
            level++;
            cur.clear();
        }
    }

    if (min(h, w) > 1 && k != 1)
    {
        vector<int> possH(h);
        vector<int> possW(w);

        for (int i = 1; i < h; i++)
        {
            int start = level;
            for (int j = 0; j + i <= h; j++)
            {

                for (int l = 0; l < h; l++)
                {
                    if (l >= j && l < j + i)cur.push_back(xorh + l);
                    else cur.push_back(notXorh + l);
                }
                add_and(cur);
                level++;
                cur.clear();
            }

            for (int j = start; j < level; j++)
            {
                cur.push_back(j);
            }
            possH[i] = level;
            add_or(cur);

            level++;

            cur.clear();
        }

        for (int i = 1; i < w; i++)
        {
            int start = level;
            for (int j = 0; j + i <= w; j++)
            {

                for (int l = 0; l < w; l++)
                {
                    if (l >= j && l < j + i) cur.push_back(xorw + l);
                    else cur.push_back(notXorw + l);
                }
                add_and(cur);
                level++;
                cur.clear();
            }

            for (int j = start; j < level; j++)
            {
                cur.push_back(j);
            }
            possW[i] = level;
            add_or(cur);

            level++;

            cur.clear();
        }

        int check1 = level;
        add_not(xorh + h - 1);
        level++;
        int check2 = level;
        add_not(xorw + w - 1);
        level++;

        for (int i = 1, j = k - 1; i < k && j >= 1; i++, j--)
        {
            if (i >= h || j >= w) continue;

            toCheck.push_back(level);
            cur.push_back(possH[i]);
            cur.push_back(possW[j]);
            cur.push_back(check1);
            cur.push_back(check2);
            add_and(cur);
            level++;
            cur.clear();
        }

    }





    add_or(toCheck);
}
#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...