이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
namespace matmul
{
    constexpr size_t W = 3, K = 250;
    struct bmatrix
    {
        bitset<1 << W> mat[1 << W];
        bmatrix operator*(bmatrix const &y) const
        {
            bmatrix res;
            for (size_t i = 0; i < 1U << W; ++i)
                for (size_t j = 0; j < 1U << W; ++j)
                    if (mat[i][j])
                        res.mat[i] |= y.mat[j];
            return res;
        }
        static bitset<1 << W> pow(bitset<1 << W> v, bmatrix pow2[31], size_t n)
        {
            size_t i = 1;
            while (n)
            {
                if (n & 1)
                {
                    v = pow2[i].mul_vec(v);
                }
                n >>= 1;
                ++i;
            }
            return v;
        }
        bool operator==(bmatrix const &y) const
        {
            for (size_t i = 0; i < 1 << W; ++i)
                if (mat[i] != y.mat[i])
                    return 0;
            return 1;
        }
        bitset<1 << W> mul_vec(bitset<1 << W> const &v) const
        {
            bitset<1 << W> res;
            for (size_t i = 0; i < 1U << W; ++i)
                res[i] = (mat[i] & v).any();
            return res;
        }
    };
    pair<size_t, size_t> p[K];
    bmatrix transitions, pow2[31];
    bitset<1 << W> state, state2;
    void run(size_t w, size_t h, size_t k)
    {
        for (size_t i = 0; i < k; ++i)
            cin >> p[i].first >> p[i].second, --p[i].first, --p[i].second;
        for (size_t y = 0; y < 1 << w; ++y)
        {
            queue<uint32_t> q;
            q.push(y << W);
            while (!q.empty())
            {
                uint32_t u = q.front();
                q.pop();
                size_t i = u >> W, j = u & ((1 << W) - 1);
                if (i == (1 << w) - 1)
                {
                    transitions.mat[j][y] = 1;
                    continue;
                }
                for (size_t h = 0; h < w; ++h)
                    if (!(i & (1 << h)))
                    {
                        if (h && !(j & (1 << h)) && !(j & (1 << (h - 1))))
                        {
                            size_t ni = i ^ (1 << h), nj = j ^ (1 << h) ^ (1 << (h - 1));
                            q.push((ni << W) | nj);
                        }
                        if (h + 1 < w && !(j & (1 << h)) && !(j & (1 << (h + 1))))
                        {
                            size_t ni = i ^ (1 << h), nj = j ^ (1 << h) ^ (1 << (h + 1));
                            q.push((ni << W) | nj);
                        }
                        if (h + 1 < w && !(i & (1 << (h + 1))) && !(j & (1 << h)))
                        {
                            size_t ni = i ^ (1 << h) ^ (1 << (h + 1)), nj = j ^ (1 << h);
                            q.push((ni << W) | nj);
                        }
                        if (h + 1 < w && !(i & (1 << (h + 1))) && !(j & (1 << (h + 1))))
                        {
                            size_t ni = i ^ (1 << h) ^ (1 << (h + 1)), nj = j ^ (1 << (h + 1));
                            q.push((ni << W) | nj);
                        }
                    }
            }
        }
        pow2[1] = transitions;
        for (size_t i = 2; i < 31; ++i)
            pow2[i] = pow2[i - 1] * pow2[i - 1];
        sort(p, p + k, [](auto const &a, auto const &b)
             { return a.second < b.second; });
        size_t i = 0, pos = 0;
        if (k && !p[0].second)
        {
            size_t x = 0;
            while (!p[i].second)
                x |= 1 << p[i].first, ++i;
            state[x] = 1;
        }
        else
            state[0] = 1;
        while (i < k)
        {
            state = bmatrix::pow(state, pow2, p[i].second - pos);
            pos = p[i].second;
            size_t x = 0;
            size_t j = i;
            while (j < k && p[j].second == p[i].second)
                x |= 1 << p[j].first, ++j;
            i = j;
            state2.reset();
            for (size_t i = 0; i < 1 << w; ++i)
                if (!(i & x) && state[i])
                    state2[i ^ x] = 1;
            state = state2;
        }
        if (pos != h - 1)
        {
            state = bmatrix::pow(state, pow2, h - 1 - pos);
        }
        cout << (state[(1 << w) - 1] ? "YES" : "NO") << '\n';
    }
}
constexpr size_t W = 13, K = 250, C = 12;
size_t w;
pair<size_t, size_t> p[K];
bitset<1 << W> state[2];
size_t r, s;
void find_transitions(uint32_t i, uint32_t j, bitset<1 << W> &next_state, size_t l = 0)
{
    if (i == (1 << w) - 1)
    {
        next_state[j] = 1;
        return;
    }
    for (size_t h = l; h < w; ++h)
        if (!(i & (1 << h)))
        {
            if (h && !(j & (1 << h)) && !(j & (1 << (h - 1))))
                find_transitions(i ^ (1 << h), j ^ (1 << h) ^ (1 << (h - 1)), next_state, h + 1);
            if (h + 1 < w && !(j & (1 << h)) && !(j & (1 << (h + 1))))
                find_transitions(i ^ (1 << h), j ^ (1 << h) ^ (1 << (h + 1)), next_state, h + 1);
            if (h + 1 < w && !(i & (1 << (h + 1))) && !(j & (1 << h)))
                find_transitions(i ^ (1 << h) ^ (1 << (h + 1)), j ^ (1 << h), next_state, h + 2);
            if (h + 1 < w && !(i & (1 << (h + 1))) && !(j & (1 << (h + 1))))
                find_transitions(i ^ (1 << h) ^ (1 << (h + 1)), j ^ (1 << (h + 1)), next_state, h + 2);
            break;
        }
}
void advance_state(size_t l)
{
    if (l <= C)
    {
        while (l--)
        {
            state[1].reset();
            for (size_t i = 0; i < 1 << w; ++i)
                if (state[0][i])
                    find_transitions(i, 0, state[1]);
            swap(state[0], state[1]);
        }
    }
    else
    {
        bitset<3> curr_components;
        for (size_t i = 0; i < 1 << w; ++i)
            if ((!(w & 1) || i != s) && state[0][i])
                curr_components[__builtin_popcount(i) % 3] = 1;
        state[0].reset();
        size_t d = (l * w) % 3;
        for (size_t i = 0; i < 1 << w; ++i)
            if ((!(w & 1) || i != r) && curr_components[(__builtin_popcount(i) + d) % 3])
                state[0][i] = 1;
    }
};
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    size_t h, k;
    cin >> w >> h >> k;
    if (w <= 3)
    {
        matmul::run(w, h, k);
        return 0;
    }
    for (size_t i = 0; i < w; i += 2)
        r |= 1 << i;
    for (size_t i = 1; i < w; i += 2)
        s |= 1 << i;
    for (size_t i = 0; i < k; ++i)
        cin >> p[i].first >> p[i].second, --p[i].first, --p[i].second;
    sort(p, p + k, [](auto const &a, auto const &b)
         { return a.second < b.second; });
    size_t i = 0, pos = 0;
    if (k && !p[0].second)
    {
        size_t x = 0;
        while (i < k && !p[i].second)
            x |= 1ULL << p[i].first, ++i;
        state[0][x] = 1;
    }
    else
        state[0][0] = 1;
    while (i < k)
    {
        advance_state(p[i].second - pos);
        pos = p[i].second;
        size_t x = 0;
        size_t j = i;
        while (j < k && p[j].second == p[i].second)
            x |= 1ULL << p[j].first, ++j;
        i = j;
        state[1].reset();
        for (size_t i = 0; i < 1 << w; ++i)
            if (!(i & x) && state[0][i])
                state[1][i ^ x] = 1;
        swap(state[0], state[1]);
    }
    advance_state(h - 1 - pos);
    cout << (state[0][(1 << w) - 1] ? "YES" : "NO") << '\n';
}
컴파일 시 표준 에러 (stderr) 메시지
ltrominoes.cpp: In function 'void matmul::run(size_t, size_t, size_t)':
ltrominoes.cpp:67:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   67 |         for (size_t y = 0; y < 1 << w; ++y)
      |                            ~~^~~~~~~~
ltrominoes.cpp:79:23: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   79 |                 if (i == (1 << w) - 1)
      |                     ~~^~~~~~~~~~~~~~~
ltrominoes.cpp:140:34: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  140 |             for (size_t i = 0; i < 1 << w; ++i)
      |                                ~~^~~~~~~~
ltrominoes.cpp: In function 'void find_transitions(uint32_t, uint32_t, std::bitset<8192>&, size_t)':
ltrominoes.cpp:164:11: warning: comparison of integer expressions of different signedness: 'uint32_t' {aka 'unsigned int'} and 'int' [-Wsign-compare]
  164 |     if (i == (1 << w) - 1)
      |         ~~^~~~~~~~~~~~~~~
ltrominoes.cpp: In function 'void advance_state(size_t)':
ltrominoes.cpp:192:34: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  192 |             for (size_t i = 0; i < 1 << w; ++i)
      |                                ~~^~~~~~~~
ltrominoes.cpp:201:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  201 |         for (size_t i = 0; i < 1 << w; ++i)
      |                            ~~^~~~~~~~
ltrominoes.cpp:208:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  208 |         for (size_t i = 0; i < 1 << w; ++i)
      |                            ~~^~~~~~~~
ltrominoes.cpp: In function 'int main()':
ltrominoes.cpp:261:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  261 |         for (size_t i = 0; i < 1 << w; ++i)
      |                            ~~^~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |