Submission #797397

# Submission time Handle Problem Language Result Execution time Memory
797397 2023-07-29T10:23:23 Z finn__ L-triominoes (CEOI21_ltriominoes) C++17
28 / 100
8000 ms 255080 KB
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,sse4")

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

constexpr size_t W = 13, 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;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    size_t w, h, k;
    cin >> w >> h >> 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];
        if (pow2[i] == pow2[i - 1])
        {
            for (size_t j = i + 1; j < 31; ++j)
                pow2[j] = pow2[i];
        }
    }

    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';
}

Compilation message

ltrominoes.cpp: In function 'int main()':
ltrominoes.cpp:74:26: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   74 |     for (size_t y = 0; y < 1 << w; ++y)
      |                        ~~^~~~~~~~
ltrominoes.cpp:86:19: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   86 |             if (i == (1 << w) - 1)
      |                 ~~^~~~~~~~~~~~~~~
ltrominoes.cpp:154:30: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  154 |         for (size_t i = 0; i < 1 << w; ++i)
      |                            ~~^~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1916 ms 254744 KB Output is correct
2 Correct 2296 ms 254792 KB Output is correct
3 Correct 2251 ms 254816 KB Output is correct
4 Correct 2168 ms 254912 KB Output is correct
5 Correct 2150 ms 254796 KB Output is correct
6 Correct 2212 ms 254812 KB Output is correct
7 Correct 1959 ms 254960 KB Output is correct
8 Execution timed out 8007 ms 84752 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1944 ms 254980 KB Output is correct
2 Correct 2318 ms 254788 KB Output is correct
3 Correct 1937 ms 254772 KB Output is correct
4 Correct 2266 ms 254668 KB Output is correct
5 Execution timed out 8079 ms 84748 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2045 ms 254900 KB Output is correct
2 Correct 1956 ms 254776 KB Output is correct
3 Correct 1950 ms 254744 KB Output is correct
4 Correct 1979 ms 254788 KB Output is correct
5 Correct 1972 ms 254712 KB Output is correct
6 Correct 1951 ms 254776 KB Output is correct
7 Correct 2348 ms 254788 KB Output is correct
8 Correct 2069 ms 254812 KB Output is correct
9 Correct 2051 ms 254668 KB Output is correct
10 Correct 1991 ms 254788 KB Output is correct
11 Correct 2464 ms 254788 KB Output is correct
12 Correct 2004 ms 254728 KB Output is correct
13 Correct 1988 ms 254784 KB Output is correct
14 Correct 2198 ms 254784 KB Output is correct
15 Correct 2084 ms 254784 KB Output is correct
16 Correct 2631 ms 254792 KB Output is correct
17 Correct 4406 ms 254800 KB Output is correct
18 Correct 2433 ms 254792 KB Output is correct
19 Correct 2264 ms 254788 KB Output is correct
20 Correct 4371 ms 254796 KB Output is correct
21 Correct 2333 ms 254792 KB Output is correct
22 Correct 2354 ms 254788 KB Output is correct
23 Correct 2365 ms 254792 KB Output is correct
24 Correct 2300 ms 254792 KB Output is correct
25 Correct 2425 ms 254788 KB Output is correct
26 Correct 3326 ms 254792 KB Output is correct
27 Correct 2300 ms 254788 KB Output is correct
28 Correct 1949 ms 254668 KB Output is correct
29 Correct 2321 ms 254788 KB Output is correct
30 Correct 4509 ms 254880 KB Output is correct
31 Correct 4205 ms 254792 KB Output is correct
32 Correct 2368 ms 254792 KB Output is correct
33 Correct 4563 ms 254792 KB Output is correct
34 Correct 4527 ms 254792 KB Output is correct
35 Correct 4926 ms 254792 KB Output is correct
36 Correct 3632 ms 254788 KB Output is correct
37 Correct 4739 ms 254788 KB Output is correct
38 Correct 3951 ms 254792 KB Output is correct
39 Correct 3682 ms 254892 KB Output is correct
40 Correct 4150 ms 254792 KB Output is correct
41 Correct 3981 ms 254800 KB Output is correct
42 Correct 2442 ms 254704 KB Output is correct
43 Correct 3274 ms 254796 KB Output is correct
44 Correct 2638 ms 254788 KB Output is correct
45 Correct 3147 ms 254792 KB Output is correct
46 Correct 2380 ms 254764 KB Output is correct
47 Correct 2820 ms 254788 KB Output is correct
48 Correct 2620 ms 254788 KB Output is correct
49 Correct 2253 ms 254776 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2365 ms 254788 KB Output is correct
2 Correct 2207 ms 254792 KB Output is correct
3 Correct 4181 ms 254812 KB Output is correct
4 Correct 1982 ms 254696 KB Output is correct
5 Correct 2358 ms 254784 KB Output is correct
6 Correct 2004 ms 254816 KB Output is correct
7 Correct 1927 ms 254800 KB Output is correct
8 Correct 2055 ms 254756 KB Output is correct
9 Correct 2071 ms 254740 KB Output is correct
10 Correct 4610 ms 254796 KB Output is correct
11 Correct 4650 ms 254812 KB Output is correct
12 Correct 4900 ms 254852 KB Output is correct
13 Correct 4604 ms 254800 KB Output is correct
14 Correct 4457 ms 254796 KB Output is correct
15 Correct 4376 ms 254776 KB Output is correct
16 Correct 4128 ms 254852 KB Output is correct
17 Correct 4396 ms 254728 KB Output is correct
18 Correct 4263 ms 254816 KB Output is correct
19 Correct 4334 ms 254848 KB Output is correct
20 Correct 3518 ms 254896 KB Output is correct
21 Correct 2576 ms 254812 KB Output is correct
22 Correct 2769 ms 254852 KB Output is correct
23 Correct 3336 ms 254772 KB Output is correct
24 Correct 4667 ms 254812 KB Output is correct
25 Correct 4121 ms 254852 KB Output is correct
26 Correct 4016 ms 254692 KB Output is correct
27 Correct 3752 ms 254812 KB Output is correct
28 Correct 2631 ms 254736 KB Output is correct
29 Correct 3700 ms 254812 KB Output is correct
30 Correct 2660 ms 254812 KB Output is correct
31 Correct 4482 ms 254816 KB Output is correct
32 Correct 4273 ms 254852 KB Output is correct
33 Correct 4277 ms 254852 KB Output is correct
34 Correct 2540 ms 254848 KB Output is correct
35 Correct 2708 ms 254848 KB Output is correct
36 Correct 2467 ms 254772 KB Output is correct
37 Correct 2693 ms 254856 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2627 ms 254920 KB Output is correct
2 Correct 2529 ms 254916 KB Output is correct
3 Correct 2561 ms 255080 KB Output is correct
4 Execution timed out 8079 ms 84852 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1916 ms 254744 KB Output is correct
2 Correct 2296 ms 254792 KB Output is correct
3 Correct 2251 ms 254816 KB Output is correct
4 Correct 2168 ms 254912 KB Output is correct
5 Correct 2150 ms 254796 KB Output is correct
6 Correct 2212 ms 254812 KB Output is correct
7 Correct 1959 ms 254960 KB Output is correct
8 Execution timed out 8007 ms 84752 KB Time limit exceeded
9 Halted 0 ms 0 KB -