public override IEnumerable <object> Solve(TextReader inputStream) { var(n, d) = inputStream.ReadValue <int, int>(); var flags = new Flag[n]; var twoSat = new TwoSat(n); for (int i = 0; i < flags.Length; i++) { var(x, y) = inputStream.ReadValue <int, int>(); flags[i] = new Flag(x, y); } for (int i = 0; i < flags.Length; i++) { for (int j = i + 1; j < flags.Length; j++) { if (Math.Abs(flags[i].X - flags[j].X) < d) { twoSat.AddClause(i, false, j, false); } if (Math.Abs(flags[i].X - flags[j].Y) < d) { twoSat.AddClause(i, false, j, true); } if (Math.Abs(flags[i].Y - flags[j].X) < d) { twoSat.AddClause(i, true, j, false); } if (Math.Abs(flags[i].Y - flags[j].Y) < d) { twoSat.AddClause(i, true, j, true); } } } var canPlace = twoSat.Satisfiable(); if (canPlace) { yield return("Yes"); var results = twoSat.Answer(); for (int i = 0; i < results.Length; i++) { yield return(results[i] ? flags[i].X : flags[i].Y); } } else { yield return("No"); } }
public static void Solve() { var(N, D) = Scanner.Scan <int, int>(); var X = new int[N]; var Y = new int[N]; for (var i = 0; i < N; i++) { (X[i], Y[i]) = Scanner.Scan <int, int>(); } var ts = new TwoSat(N); for (var i = 0; i < N; i++) { for (var j = i + 1; j < N; j++) { if (Math.Abs(X[i] - X[j]) < D) { ts.AddClause(i, false, j, false); } if (Math.Abs(X[i] - Y[j]) < D) { ts.AddClause(i, false, j, true); } if (Math.Abs(Y[i] - X[j]) < D) { ts.AddClause(i, true, j, false); } if (Math.Abs(Y[i] - Y[j]) < D) { ts.AddClause(i, true, j, true); } } } if (!ts.IsSatisfiable()) { Console.WriteLine("No"); return; } Console.WriteLine("Yes"); var answer = ts.Answer; for (var i = 0; i < N; i++) { Console.WriteLine(answer[i] ? X[i] : Y[i]); } }
public static long Calc(int n) { n >>= 4; long ans = 0; var twoSat = new TwoSat(n); for (int i = 0; i < n; i++) { twoSat.AddClause(i, true, (i + 1) % n, false); } var ok = twoSat.Satisfiable(); ans = twoSat.Answer()[0] ? 1 : -1; return(ans); }
public void Solve(ConsoleReader cr, ConsoleWriter cw) { _ = cr.Ascii(); _ = cr.Ascii(); int n = cr; int m = cr; var twoSat = new TwoSat(n); for (int i = 0; i < m; i++) { int a = cr; int b = cr; _ = cr.Int(); int a1 = Math.Abs(a) - 1; bool a2 = a >= 0; int b1 = Math.Abs(b) - 1; bool b2 = b >= 0; twoSat.AddClause(a1, a2, b1, b2); } if (twoSat.Satisfiable()) { cw.WriteLine("s SATISFIABLE"); cw.StreamWriter.Write("v "); var res = new int[n + 1]; var answer = twoSat.Answer(); for (int i = 0; i < n; i++) { if (answer[i]) { res[i] = i + 1; } else { res[i] = -(i + 1); } } cw.WriteLineJoin(res); } else { cw.WriteLine("s UNSATISFIABLE"); } }
static void Main() { var(n, d) = Read2(); var ps = Array.ConvertAll(new bool[n], _ => Read()); var sat = new TwoSat(n); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { Prop pi = i, pj = j; // 0: F, 1: T // !(x & y) if (Math.Abs(ps[i][0] - ps[j][0]) < d) { sat.AddOr(pi, pj); } if (Math.Abs(ps[i][0] - ps[j][1]) < d) { sat.AddOr(pi, !pj); } if (Math.Abs(ps[i][1] - ps[j][0]) < d) { sat.AddOr(!pi, pj); } if (Math.Abs(ps[i][1] - ps[j][1]) < d) { sat.AddOr(!pi, !pj); } } } var r = sat.Execute(); if (r == null) { Console.WriteLine("No"); return; } Console.WriteLine("Yes"); Console.WriteLine(string.Join("\n", r.Select((v, i) => ps[i][v ? 1 : 0]))); }
public void Solve() { int nt = ReadInt(); for (int tt = 1; tt <= nt; tt++) { rs = ReadInt(); cs = ReadInt(); a = ReadLines(rs); id = new int[rs, cs]; int n = 0, m = 0; for (int i = 0; i < rs; i++) { for (int j = 0; j < cs; j++) { if (a[i][j] == '.') { id[i, j] = n++; } else if (a[i][j] == '-' || a[i][j] == '|') { id[i, j] = m++; } } } bool ok = true; var lists = Init <List <int> >(n); var ver = new bool[m]; for (int i = 0; i < rs; i++) { for (int j = 0; j < cs; j++) { if (a[i][j] == '-' || a[i][j] == '|') { var list1 = Check(i, j, false); var list2 = Check(i, j, true); if (list1 == null && list2 == null) { ok = false; } if (list1 != null) { foreach (int x in list1) { lists[x].Add(id[i, j]); } } else { ver[id[i, j]] = true; } if (list2 != null) { foreach (int x in list2) { lists[x].Add(id[i, j] + m); } } } } } var g = Init <List <int> >(2 * m); for (int i = 0; i < n; i++) { if (lists[i].Count == 0) { ok = false; } else if (lists[i].Count == 1) { g[(lists[i][0] + m) % (2 * m)].Add(lists[i][0]); } else { g[(lists[i][0] + m) % (2 * m)].Add(lists[i][1]); g[(lists[i][1] + m) % (2 * m)].Add(lists[i][0]); } } if (!ok) { writer.WriteLine("Case #{0}: {1}", tt, "IMPOSSIBLE"); continue; } var match = TwoSat.Match(g); if (match == null) { writer.WriteLine("Case #{0}: {1}", tt, "IMPOSSIBLE"); continue; } writer.WriteLine("Case #{0}: {1}", tt, "POSSIBLE"); for (int i = 0; i < rs; i++) { for (int j = 0; j < cs; j++) { if (a[i][j] == '-' || a[i][j] == '|') { writer.Write(ver[id[i, j]] || !match[id[i, j]] ? '|' : '-'); } else { writer.Write(a[i][j]); } } Write(); } } }