Esempio n. 1
0
    static void Main()
    {
        Sc  sc  = new Sc();
        int n   = sc.I;
        Bit bit = new Bit(n * 2);

        int[]    b = new int[n + 1], w = new int[n + 1];
        string[] a = new string[n * 2];
        int[]    r = new int[n * 2];
        for (int i = 0; i < n * 2; i++)
        {
            a[i] = sc.S;
            r[i] = int.Parse((a[i].Split())[1]);
            if (a[i][0] == 'B')
            {
                b[r[i]] = i;
            }
            else
            {
                w[r[i]] = i;
            }
        }
        long[,,] dp = new long[n + 1, n + 1, 2];
        for (int i = 0; i <= n; i++)
        {
            bit = new Bit(n * 2);
            if (i != 0)
            {
                for (int j = 1; j < i; j++)
                {
                    bit.Ud(b[j] + 1, 1);
                }
                dp[i, 0, 0] = dp[i - 1, 0, 0] + b[i] - bit.Get(b[i] + 1);
                bit.Ud(b[i] + 1, 1);
            }
            for (int j = 1; j <= n; j++)
            {
                dp[i, j, 0] = dp[i, j - 1, 0] + w[j] - bit.Get(w[j] + 1);
                if (i != 0)
                {
                    dp[i, j, 0] = Math.Min(dp[i, j, 0], dp[i - 1, j, 0] + b[i] - dp[i - 1, j, 1]);
                }
                if (j != 0)
                {
                    bit.Ud(w[j] + 1, 1);
                }
                if (i != n)
                {
                    dp[i, j, 1] = bit.Get(b[i + 1] + 1);
                }
            }
            bit.Clear();
        }
        Console.WriteLine("{0}", dp[n, n, 0]);
    }