Submission #531592

#TimeUsernameProblemLanguageResultExecution timeMemory
531592eecsL-triominoes (CEOI21_ltriominoes)C++17
10 / 100
8074 ms4540 KiB
#include <bits/stdc++.h>
using namespace std;

int W, H, K, x[250], y[250];
bool f[1 << 13], g[1 << 13];
vector<array<int, 2>> E;

int main() {
    scanf("%d %d %d", &W, &H, &K);
    vector<int> pos = {1, H};
    for (int S = 0; S < 1 << W; S++) {
        function<void(int, int)> dfs = [&](int i, int T) {
            if (i == W) { E.push_back({S, T}); return; }
            if (S >> i & 1) return dfs(i + 1, T);
            if (i && !(T >> (i - 1) & 1) && !(T >> i & 1)) dfs(i + 1, T | (1 << (i - 1)) | (1 << i));
            if (i + 1 == W) return;
            if (!(T >> i & 1) && !(T >> (i + 1) & 1)) dfs(i + 1, T | (1 << i) | (1 << (i + 1)));
            if (!(S >> (i + 1) & 1) && !(T >> i & 1)) dfs(i + 2, T | (1 << i));
            if (!(S >> (i + 1) & 1) && !(T >> (i + 1) & 1)) dfs(i + 2, T | (1 << (i + 1)));
        };
        dfs(0, 0);
    }
    for (int i = 0; i < K; i++) {
        scanf("%d %d", &x[i], &y[i]), pos.push_back(y[i]);
    }
    sort(pos.begin(), pos.end());
    pos.resize(unique(pos.begin(), pos.end()) - pos.begin());
    f[0] = 1;
    for (int i = 0; i < pos.size(); i++) {
        memset(g, 0, sizeof(g));
        int S = 0;
        for (int j = 0; j < K; j++) {
            if (pos[i] == y[j]) S |= 1 << (x[j] - 1);
        }
        for (int j = 0; j < 1 << W; j++) {
            if (!(j & S)) g[j | S] |= f[j];
        }
        swap(f, g);
        if (i == pos.size() - 1) break;
        for (int $ = 1; $ <= pos[i + 1] - pos[i]; $++) {
            memset(g, 0, sizeof(g));
            for (auto &e : E) g[e[1]] |= f[e[0]];
            bool flag = 0;
            for (int j = 0; j < 1 << W; j++) {
                if (f[j] ^ g[j]) { flag = 1; break; }
            }
            if (!flag) break;
            swap(f, g);
        }
    }
    puts(f[(1 << W) - 1] ? "YES" : "NO");
    return 0;
}

Compilation message (stderr)

ltrominoes.cpp: In function 'int main()':
ltrominoes.cpp:29:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     for (int i = 0; i < pos.size(); i++) {
      |                     ~~^~~~~~~~~~~~
ltrominoes.cpp:39:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |         if (i == pos.size() - 1) break;
      |             ~~^~~~~~~~~~~~~~~~~
ltrominoes.cpp:9:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 |     scanf("%d %d %d", &W, &H, &K);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ltrominoes.cpp:24:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         scanf("%d %d", &x[i], &y[i]), pos.push_back(y[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...