Esempio n. 1
0
        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");
            }
        }
Esempio n. 2
0
        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]);
            }
        }
Esempio n. 3
0
    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");
            }
        }
Esempio n. 5
0
    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])));
    }
Esempio n. 6
0
File: 0.cs Progetto: qifanyyy/CLCDSA
    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();
            }
        }
    }