結果
問題 | No.470 Inverse S+T Problem |
ユーザー |
|
提出日時 | 2016-12-19 14:48:36 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,879 bytes |
コンパイル時間 | 1,892 ms |
コンパイル使用メモリ | 118,484 KB |
実行使用メモリ | 814,868 KB |
最終ジャッジ日時 | 2024-12-22 13:07:01 |
合計ジャッジ時間 | 9,385 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 24 MLE * 3 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <array>#include <set>#include <map>#include <queue>#include <tuple>#include <unordered_set>#include <unordered_map>#include <functional>#include <cassert>#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))#define repeat_from(i,m,n) for (int i = (m); (i) < int(n); ++(i))#define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i))#define repeat_from_reverse(i,m,n) for (int i = (n)-1; (i) >= int(m); --(i))#define whole(f,x,...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)typedef long long ll;using namespace std;struct strongly_connected_components {static pair<int,vector<int> > decompose(vector<vector<int> > const & g) { // adjacent liststrongly_connected_components scc(g);return { scc.k, scc.c };}private:int n;vector<vector<int> > to, from;explicit strongly_connected_components(vector<vector<int> > const & g) : n(g.size()), to(g), from(n) {repeat (i,n) for (int j : to[i]) from[j].push_back(i);decompose();}vector<bool> used;vector<int> vs;void dfs(int i) {used[i] = true;for (int j : to[i]) if (not used[j]) dfs(j);vs.push_back(i);}int k; // number of sccvector<int> c; // i-th vertex in g is in c_i-th vertex in scc-decomposed gvoid rdfs(int i) {used[i] = true;c[i] = k;for (int j : from[i]) if (not used[j]) rdfs(j);}void decompose() {used.clear(); used.resize(n, false);repeat (i,n) if (not used[i]) dfs(i);used.clear(); used.resize(n, false);k = 0;c.resize(n);reverse(vs.begin(), vs.end());for (int i : vs) if (not used[i]) {rdfs(i);k += 1;}}};vector<bool> twosat(int n, vector<pair<int, int> > const & cnf) {vector<vector<int> > g(2*n);auto i = [&](int x) { assert (x != 0 and abs(x) <= n); return x > 0 ? x-1 : n-x-1; };for (auto it : cnf) {int x, y; tie(x, y) = it; // x or yg[i(- x)].push_back(i(y)); // not x implies yg[i(- y)].push_back(i(x)); // not y implies x}vector<int> component = strongly_connected_components::decompose(g).second;vector<bool> valuation(n);repeat_from (x,1,n+1) {if (component[i(x)] == component[i(- x)]) { // x iff not xreturn vector<bool>(); // unsat}valuation[x-1] = component[i(x)] > component[i(- x)]; // use components which indices are large}return valuation;}int main() {int n; cin >> n;vector<string> s(n); repeat (i,n) cin >> s[i];// x_i : U_i = S + TT// not x_i : U_i = SS + Tvector<pair<int, int> > cnf; {map<string, vector<int> > used;repeat (i,n) {int x = i + 1;used[s[i].substr(0, 1)].push_back(+ x);used[s[i].substr(1, 2)].push_back(+ x);used[s[i].substr(0, 2)].push_back(- x);used[s[i].substr(2, 1)].push_back(- x);}for (auto it : used) {for (int x : it.second) for (int y : it.second) if (x < y) {// cerr << "not " << x << " or " << "not " << y << endl;cnf.emplace_back(- x, - y); // not x or not y}}}auto result = twosat(n, cnf);if (result.empty()) {cout << "Impossible" << endl;// assert (false); // 解が存在するような入力が与えられることが保証されます。 ???} else {repeat (i,n) {if (result[i]) {cout << s[i][0] << ' ' << s[i][1] << s[i][2] << endl;} else {cout << s[i][0] << s[i][1] << ' ' << s[i][2] << endl;}}}return 0;}