コード例 #1
0
    private int BinSearch(int a, int b, int need, int M, PersistentPartialUnionFind uf)
    {
        int L = -1, R = M;

        while (R - L > 1)
        {
            int mid = L + R >> 1;
            int x   = uf.Root(a, mid);
            int y   = uf.Root(b, mid);
            int num = uf.NumElements(x, mid);
            if (num < need && x != y)
            {
                num += uf.NumElements(y, mid);
            }
            if (num >= need)
            {
                R = mid;
            }
            else
            {
                L = mid;
            }
        }
        return(R);
    }
コード例 #2
0
ファイル: 852013.cs プロジェクト: qifanyyy/CLCDSA
    private int BinSearch(int a, int b, int need, int M, PersistentPartialUnionFind uf)
    {
        int L = -1, R = M;

        while (R - L > 1)
        {
            int mid = L + R >> 1;
            int num = uf.NumElements(a, mid) + (uf.Same(a, b, mid) ? 0 : uf.NumElements(b, mid));
            if (num >= need)
            {
                R = mid;
            }
            else
            {
                L = mid;
            }
        }
        return(R);
    }
コード例 #3
0
ファイル: 852013.cs プロジェクト: qifanyyy/CLCDSA
    public void Solve()
    {
        int N = Reader.Int(), M = Reader.Int();
        var E  = Reader.IntTable(M);
        int NQ = Reader.Int();
        var Q  = Reader.IntTable(NQ);
        var uf = new PersistentPartialUnionFind(N);

        Console.SetOut(new StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });

        foreach (var e in E)
        {
            uf.Unite(--e[0], --e[1]);
        }
        foreach (var q in Q)
        {
            Console.WriteLine(BinSearch(--q[0], --q[1], q[2], M, uf));
        }

        Console.Out.Flush();
    }