제출 #572697

#제출 시각아이디문제언어결과실행 시간메모리
572697piOOEAmusement Park (CEOI19_amusementpark)C++17
19 / 100
3072 ms336 KiB
#include <bits/stdc++.h> using namespace std; #define sz(x) ((int)size(x)) #define all(x) begin(x), end(x) #define trace(x) cout << #x << ": " << (x) << endl; typedef long long ll; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return (int) ((ll) rnd() % (r - l + 1)) + l; } const int N = 18, M = N * (N - 1) / 2, mod = 998244353; vector<int> g[N], rg[N], new_g[N]; bool used[N]; int A[M], B[M], tp[N]; bool dfs(int v) { tp[v] = 1; for (int to : new_g[v]) { if (!tp[to]) { if (dfs(to)) { return true; } } else if (tp[to] == 1){ return true; } } tp[v] = 2; return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; --a, --b; A[i] = a, B[i] = b; g[a].push_back(b); rg[b].push_back(a); } int ans = 0; for (int mask = 1; mask < (1 << m); ++mask) { for (int i = 0; i < n; ++i) { new_g[i].clear(); } memset(tp, 0, sizeof(tp)); int sum = 0; for (int i = 0; i < m; ++i) { if (mask & 1 << i) { new_g[B[i]].push_back(A[i]); ++sum; } else { new_g[A[i]].push_back(B[i]); } } bool ok = true; for (int i = 0; i < n; ++i) { if (!tp[i] && ok) { ok &= !dfs(i); } } if (ok) { ans += sum; ans %= mod; } } 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...