結果
問題 | No.1078 I love Matrix Construction |
ユーザー |
![]() |
提出日時 | 2020-12-04 19:18:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 67 ms / 2,000 ms |
コード長 | 6,831 bytes |
コンパイル時間 | 3,235 ms |
コンパイル使用メモリ | 218,964 KB |
最終ジャッジ日時 | 2025-01-16 15:59:47 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#define MOD_TYPE 1#pragma region Macros#include <bits/stdc++.h>using namespace std;#if 0#include <boost/multiprecision/cpp_int.hpp>#include <boost/multiprecision/cpp_dec_float.hpp>using Int = boost::multiprecision::cpp_int;using lld = boost::multiprecision::cpp_dec_float_100;#endif#if 1#pragma GCC target("avx2")#pragma GCC optimize("O3")#pragma GCC optimize("unroll-loops")#endifusing ll = long long int;using ld = long double;using pii = pair<int, int>;using pll = pair<ll, ll>;using pld = pair<ld, ld>;template <typename Q_type>using smaller_queue = priority_queue<Q_type, vector<Q_type>, greater<Q_type>>;constexpr ll MOD = (MOD_TYPE == 1 ? (ll)(1e9 + 7) : 998244353);constexpr int INF = (int)1e9 + 10;constexpr ll LINF = (ll)4e18;constexpr double PI = acos(-1.0);constexpr double EPS = 1e-7;constexpr int Dx[] = {0, 0, -1, 1, -1, 1, -1, 1, 0};constexpr int Dy[] = {1, -1, 0, 0, -1, -1, 1, 1, 0};#define REP(i, m, n) for (ll i = m; i < (ll)(n); ++i)#define rep(i, n) REP(i, 0, n)#define REPI(i, m, n) for (int i = m; i < (int)(n); ++i)#define repi(i, n) REPI(i, 0, n)#define MP make_pair#define MT make_tuple#define YES(n) cout << ((n) ? "YES" : "NO") << "\n"#define Yes(n) cout << ((n) ? "Yes" : "No") << "\n"#define possible(n) cout << ((n) ? "possible" : "impossible") << "\n"#define Possible(n) cout << ((n) ? "Possible" : "Impossible") << "\n"#define all(v) v.begin(), v.end()#define NP(v) next_permutation(all(v))#define dbg(x) cerr << #x << ":" << x << "\n";struct io_init{io_init(){cin.tie(0);ios::sync_with_stdio(false);cout << setprecision(30) << setiosflags(ios::fixed);};} io_init;template <typename T>inline bool chmin(T &a, T b){if (a > b){a = b;return true;}return false;}template <typename T>inline bool chmax(T &a, T b){if (a < b){a = b;return true;}return false;}inline ll CEIL(ll a, ll b){return (a + b - 1) / b;}template <typename A, size_t N, typename T>inline void Fill(A (&array)[N], const T &val){fill((T *)array, (T *)(array + N), val);}template <typename T, typename U>constexpr istream &operator>>(istream &is, pair<T, U> &p) noexcept{is >> p.first >> p.second;return is;}template <typename T, typename U>constexpr ostream &operator<<(ostream &os, pair<T, U> &p) noexcept{os << p.first << " " << p.second;return os;}#pragma endregionnamespace atcoder{namespace internal{template <class E>struct csr{std::vector<int> start;std::vector<E> elist;csr(int n, const std::vector<std::pair<int, E>> &edges): start(n + 1), elist(edges.size()){for (auto e : edges){start[e.first + 1]++;}for (int i = 1; i <= n; i++){start[i] += start[i - 1];}auto counter = start;for (auto e : edges){elist[counter[e.first]++] = e.second;}}};// Reference:// R. Tarjan,// Depth-First Search and Linear Graph Algorithmsstruct scc_graph{public:scc_graph(int n) : _n(n) {}int num_vertices() { return _n; }void add_edge(int from, int to) { edges.push_back({from, {to}}); }// @return pair of (# of scc, scc id)std::pair<int, std::vector<int>> scc_ids(){auto g = csr<edge>(_n, edges);int now_ord = 0, group_num = 0;std::vector<int> visited, low(_n), ord(_n, -1), ids(_n);visited.reserve(_n);auto dfs = [&](auto self, int v) -> void {low[v] = ord[v] = now_ord++;visited.push_back(v);for (int i = g.start[v]; i < g.start[v + 1]; i++){auto to = g.elist[i].to;if (ord[to] == -1){self(self, to);low[v] = std::min(low[v], low[to]);}else{low[v] = std::min(low[v], ord[to]);}}if (low[v] == ord[v]){while (true){int u = visited.back();visited.pop_back();ord[u] = _n;ids[u] = group_num;if (u == v)break;}group_num++;}};for (int i = 0; i < _n; i++){if (ord[i] == -1)dfs(dfs, i);}for (auto &x : ids){x = group_num - 1 - x;}return {group_num, ids};}std::vector<std::vector<int>> scc(){auto ids = scc_ids();int group_num = ids.first;std::vector<int> counts(group_num);for (auto x : ids.second)counts[x]++;std::vector<std::vector<int>> groups(ids.first);for (int i = 0; i < group_num; i++){groups[i].reserve(counts[i]);}for (int i = 0; i < _n; i++){groups[ids.second[i]].push_back(i);}return groups;}private:int _n;struct edge{int to;};std::vector<std::pair<int, edge>> edges;};} // namespace internal} // namespace atcodernamespace atcoder{// Reference:// B. Aspvall, M. Plass, and R. Tarjan,// A Linear-Time Algorithm for Testing the Truth of Certain Quantified Boolean// Formulasstruct two_sat{public:two_sat() : _n(0), scc(0) {}two_sat(int n) : _n(n), _answer(n), scc(2 * n) {}void add_clause(int i, bool f, int j, bool g){assert(0 <= i && i < _n);assert(0 <= j && j < _n);scc.add_edge(2 * i + (f ? 0 : 1), 2 * j + (g ? 1 : 0));scc.add_edge(2 * j + (g ? 0 : 1), 2 * i + (f ? 1 : 0));}bool satisfiable(){auto id = scc.scc_ids().second;for (int i = 0; i < _n; i++){if (id[2 * i] == id[2 * i + 1])return false;_answer[i] = id[2 * i] < id[2 * i + 1];}return true;}std::vector<bool> answer() { return _answer; }private:int _n;std::vector<bool> _answer;internal::scc_graph scc;};} // namespace atcodervoid solve(){int n;cin >> n;vector<int> s(n), t(n), u(n);rep(i, n) cin >> s[i], s[i]--;rep(i, n) cin >> t[i], t[i]--;rep(i, n) cin >> u[i];atcoder::two_sat ts(n * n);rep(i, n){bool a = !(u[i] & 1), b = !(u[i] & 2);rep(j, n){int p = s[i] * n + j, q = j * n + t[i];ts.add_clause(p, a, q, b);}}bool ex = ts.satisfiable();if (!ex){cout << -1 << "\n";return;}auto ans = ts.answer();rep(i, n * n){cout << ans[i] << (i % n == n - 1 ? "\n" : " ");}}int main(){solve();}