Example #1
0
    static void Main()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => Read5());

        var tree = new Tree(n + 1, 1, es);
        var lca  = new BLLca(tree);

        Console.WriteLine(string.Join("\n", qs
                                      .Select(q =>
        {
            var(x, y, a, b, k) = q;
            var ab             = lca.GetDistance(a, b);
            if (ab <= k && ab % 2 == k % 2)
            {
                return(true);
            }

            ab = Math.Min(lca.GetDistance(a, x) + lca.GetDistance(y, b), lca.GetDistance(a, y) + lca.GetDistance(x, b)) + 1;
            return(ab <= k && ab % 2 == k % 2);
        })
                                      .Select(b => b ? "YES" : "NO")));
    }
Example #2
0
    static void Main()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var qc = int.Parse(Console.ReadLine());

        var tree = new Tree(n + 1, 1, es);
        var bll  = new BLLca(tree);

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        for (int qi = 0; qi < qc; qi++)
        {
            var vs = Read().Skip(1).OrderBy(v => tree.TourMap[v][0]).ToArray();
            var k  = vs.Length;

            var r = 0;
            for (int i = 0; i < k; i++)
            {
                r += bll.GetDistance(vs[i], vs[(i + 1) % k]);
            }
            Console.WriteLine(r / 2);
        }
        Console.Out.Flush();
    }
Example #3
0
    static void Main()
    {
        var(n, m) = Read2();
        var es = Array.ConvertAll(new bool[m], _ => Read());
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => Read2());

        var(treeEdges, es2) = GetUndirectedTree(n + 1, es);
        var tree = new Tree(n + 1, 1, treeEdges);
        var lca  = new BLLca(tree);

        var vs2  = es2.SelectMany(e => e).Distinct().ToArray();
        var vmap = Enumerable.Range(0, vs2.Length).ToDictionary(i => vs2[i], i => i);

        var wfes = new List <int[]>();

        for (int i = 0; i < vs2.Length; i++)
        {
            for (int j = 0; j < vs2.Length; j++)
            {
                wfes.Add(new[] { i, j, lca.GetDistance(vs2[i], vs2[j]) });
            }
        }
        foreach (var e in es2)
        {
            wfes.Add(new[] { vmap[e[0]], vmap[e[1]], 1 });
        }
        var wfd = WarshallFloyd(vs2.Length, wfes.ToArray(), false).Item1;

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var(u, v) in qs)
        {
            var r = lca.GetDistance(u, v);

            for (int i = 0; i < vs2.Length; i++)
            {
                for (int j = 0; j < vs2.Length; j++)
                {
                    var d = lca.GetDistance(u, vs2[i]) + (int)wfd[i][j] + lca.GetDistance(vs2[j], v);
                    r = Math.Min(r, d);
                }
            }
            Console.WriteLine(r);
        }
        Console.Out.Flush();
    }
Example #4
0
    static void Main()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var qc = int.Parse(Console.ReadLine());

        var tree = new Tree(n + 1, 1, es);
        var bll  = new BLLca(tree);

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        for (int qi = 0; qi < qc; qi++)
        {
            var vs = Read().Skip(1).OrderBy(v => tree.TourMap[v][0]).ToArray();

            var r  = 0;
            var tv = bll.GetLca(vs[0], vs[^ 1]);
Example #5
0
    static object Solve()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var m  = int.Parse(Console.ReadLine());
        var ps = Array.ConvertAll(new bool[m], _ => Read2());

        var tree  = new Tree(n + 1, 1, es);
        var bllca = new BLLca(tree);

        var fs = new ulong[m];

        for (int j = 0; j < m; j++)
        {
            var(u, v) = ps[j];
            var lca = bllca.GetLca(u, v);

            for (int x = u; x != lca; x = tree.Parents[x])
            {
                fs[j] |= 1UL << x;
            }
            for (int x = v; x != lca; x = tree.Parents[x])
            {
                fs[j] |= 1UL << x;
            }
        }

        return(InclusionExclusion(m, GetCount));

        long GetCount(bool[] b)
        {
            var or = 0UL;

            for (int j = 0; j < m; j++)
            {
                if (b[j])
                {
                    or |= fs[j];
                }
            }
            return(1L << n - 1 - BitOperations.PopCount(or));
        }
    }
Example #6
0
    static object Solve()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var m  = int.Parse(Console.ReadLine());
        var ps = Array.ConvertAll(new bool[m], _ => Read2());

        var set = new HashSet <int>();

        var tree  = new Tree(n + 1, 1, es);
        var bllca = new BLLca(tree);

        return(InclusionExclusion(m, GetCount));

        long GetCount(bool[] b)
        {
            set.Clear();

            for (int j = 0; j < m; j++)
            {
                if (b[j])
                {
                    var(u, v) = ps[j];
                    var lca = bllca.GetLca(u, v);

                    for (int x = u; x != lca; x = tree.Parents[x])
                    {
                        set.Add(x);
                    }
                    for (int x = v; x != lca; x = tree.Parents[x])
                    {
                        set.Add(x);
                    }
                }
            }

            return(1L << n - 1 - set.Count);
        }
    }
Example #7
0
    static object Solve()
    {
        var n  = int.Parse(Console.ReadLine());
        var es = Array.ConvertAll(new bool[n - 1], _ => Read());
        var m  = int.Parse(Console.ReadLine());
        var ps = Array.ConvertAll(new bool[m], _ => Read2());

        var tree  = new Tree(n + 1, 1, es);
        var bllca = new BLLca(tree);

        var fs = new ulong[m];

        for (int j = 0; j < m; j++)
        {
            var(u, v) = ps[j];
            var lca = bllca.GetLca(u, v);

            for (int x = u; x != lca; x = tree.Parents[x])
            {
                fs[j] |= 1UL << x;
            }
            for (int x = v; x != lca; x = tree.Parents[x])
            {
                fs[j] |= 1UL << x;
            }
        }

        var dp = new ulong[1 << m];

        for (int x = 0; x < 1 << m; x++)
        {
            for (int j = 0; j < m; j++)
            {
                dp[x | (1 << j)] = dp[x] | fs[j];
            }
        }
        return(InclusionExclusion(m, x => 1L << n - 1 - BitOperations.PopCount(dp[x])));
    }