답안 #246993

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
246993 2020-07-10T17:18:10 Z stoyan_malinin Vision Program (IOI19_vision) C++14
0 / 100
25 ms 2492 KB
#include "vision.h"
//#include "grader.cpp"

#include<iostream>
#include<cstring>
#include<vector>

using namespace std;

int n, m, k;
const int MAXLog = 15;

int zero, one;

struct Number
{
    int b[20];

    Number()
    {
        for(int bit = 0;bit<MAXLog;bit++)
        {
            this->b[bit] = zero;
        }
    }
    Number(int x)
    {
        for(int bit = 0;bit<MAXLog;bit++)
        {
            this->b[bit] = (((x>>bit)&1)==0?zero:one);
        }
    }

    int getVal()
    {
        int out = 0;
        //for(int bit = 0;bit<MAXLog;bit++) out += memory_cells[ b[bit] ]*(1<<bit);

        return out;
    }

    int &operator [](int ind)
    {
        return b[ind];
    }
};

Number operator +(Number A, Number B)
{
    Number C;
    int toAdd = zero;

    for(int i = 0;i<MAXLog;i++)
    {
        C[i] = add_xor({toAdd, A[i], B[i]});
        toAdd = add_or({add_and({toAdd, A[i]}), add_and({toAdd, B[i]}), add_and({A[i], B[i]})});
    }

    return C;
}

Number operator -(Number A, Number B)
{
    Number C;
    int toRem = zero;

    for(int i = 0;i<MAXLog;i++)
    {
        C[i] = add_xor({toRem, A[i], B[i]});
        toRem = add_or({add_and({toRem, A[i], B[i]}), add_and({add_not(A[i]), add_or({toRem, B[i]})})});
    }

    return C;
}

int cell2Pos(int r, int c)
{
    return n*r + c;
}

void init()
{
    vector <int> all;
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            all.push_back(cell2Pos(i, j));
        }
    }

    zero = add_and(all);
    one = add_or(all);
}

Number getDiff(vector <int> &v)
{
    Number A, B;

    int active = one;
    for(int i = 0;i<v.size();i++)
    {
        int newVal = add_and({active, v[i]});
        for(int bit = 0;bit<8;bit++)
        {
            if(((i>>bit)&1)==1)
            {
                A[bit] = add_or({A[bit], newVal});
            }
        }

        active = add_and({active, add_not(v[i])});
    }

    active = one;
    for(int i = v.size()-1;i>=0;i--)
    {
        int newVal = add_and({active, v[i]});
        for(int bit = 0;bit<8;bit++)
        {
            if(((i>>bit)&1)==1)
            {
                B[bit] = add_or({B[bit], newVal});
            }
        }

        active = add_and({active, add_not(v[i])});
    }

    Number diff = B - A;
    return diff;
}

void construct_network(int H, int W, int K)
{
    n = H;
    m = W;
    k = K;
    init();

    vector <int> v;
    for(int i = 0;i<n;i++)
    {
        vector <int> ask;
        for(int j = 0;j<m;j++) ask.push_back(cell2Pos(i, j));

        v.push_back(add_xor(ask));
    }
    Number A = getDiff(v);

    v.clear();
    for(int j = 0;j<m;j++)
    {
        vector <int> ask;
        for(int i = 0;i<n;i++) ask.push_back(cell2Pos(i, j));

        v.push_back(add_xor(ask));
    }
    Number B = getDiff(v);

    Number sum = A + B;
    vector <int> requirements;
    for(int bit = 0;bit<MAXLog;bit++)
    {
        int val = (((k>>bit)&1)==0?zero:one);
        requirements.push_back(add_not(add_xor({val, sum[bit]})));
    }

    add_and(requirements);
}

Compilation message

vision.cpp: In function 'Number getDiff(std::vector<int>&)':
vision.cpp:101:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i<v.size();i++)
                   ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 256 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 256 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 256 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 256 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 660 KB Output is correct
2 Correct 7 ms 640 KB Output is correct
3 Correct 7 ms 640 KB Output is correct
4 Correct 6 ms 640 KB Output is correct
5 Incorrect 5 ms 256 KB WA in grader: Invalid index
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 384 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 2492 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 384 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
3 Incorrect 5 ms 256 KB WA in grader: Invalid index
4 Halted 0 ms 0 KB -