Submission #1111033

#TimeUsernameProblemLanguageResultExecution timeMemory
1111033crafticatAmusement Park (CEOI19_amusementpark)C++17
42 / 100
3059 ms588 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T>
using V = vector<T>;
using vi = V<int>;
using vb = V<bool>;
using pi = pair<int,int>;

#define F0R(i,n) for (int i = 0; i < n;i++)
#define FOR(i, j, n) for(int i = j; i < n;i++)
#define ckmin(x,y) x = min(x,y)
#define f first
#define s second
using ll = long long;
constexpr int MOD = 998244353;

V<int> vis;
V<V<int>> g;

bool dfs(int x) {
    if (vis[x] == 1) return false;
    vis[x] = 1;
    for (auto y : g[x]) {
        if (vis[y] == 2) continue;
        if (!dfs(y)) return false;
    }

    vis[x] = 2;
    return true;
}

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

    int n, m; cin >> n >> m;
    V<pi> edges(m);
    set<pi> exists;

    F0R(i, m) {
        int x, y; cin >> x >> y;
        x--;
        y--;
        edges[i] = {x,y};
        exists.insert({x,y});
        exists.insert({y,x});
    }

    ll ans = 0;
    vi perm(n); // Height of I
    F0R(i, n)
        perm[i] = i;

    do {
        int cost = 0;
        for (auto [a,b] : edges) {
            if (perm[a] > perm[b]) cost++;
        }
        bool pos = true;
        V<pi> check;
        F0R(i, n) {
            check.emplace_back(perm[i],i);
        }
        std::sort(check.begin(), check.end());

        F0R(i, n - 1) {
            int a = check[i].s;
            for (int j = i + 1; j < n; ++j) {
                int b = check[j].s;
                if (exists.count({a,b})) break;
                if (a > b) pos = false;
            }
        }
        if (pos)
            ans += cost;

        ans %= MOD;
    } while (std::next_permutation(perm.begin(), perm.end()));

    cout << ans;

    return 0;
}
#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...