Esempio n. 1
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Read();
        var b = Read();

        var gs = Enumerable.Range(0, n)
                 .Select(i => (a: a[i], b: b[i]))
                 .GroupBy(p => p)
                 .OrderBy(g => g.Key.a)
                 .ThenBy(g => - g.Key.b)
                 .ToArray();

        var r   = 0L;
        var set = new WBMultiSet <int>();

        foreach (var g in gs)
        {
            var v = g.Key.b;
            var c = g.LongCount();

            r += c * set.GetCount(x => x >= v, x => true);
            r += c * c;

            while (c-- > 0)
            {
                set.Add(v);
            }
        }

        return(r);
    }
Esempio n. 2
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Read();
        var b = Read();

        var indexes = Enumerable.Range(0, n)
                      .OrderBy(i => a[i])
                      .ThenBy(i => - b[i])
                      .ToArray();

        var r   = 0L;
        var set = new WBMultiSet <int>();

        foreach (var i in indexes)
        {
            set.Add(b[i]);
            r += set.GetCount(x => x >= b[i], x => true);
        }

        foreach (var g in indexes.Select(i => (a[i], b[i])).GroupBy(p => p))
        {
            var c = g.LongCount();
            r += c * (c - 1) / 2;
        }

        return(r);
    }
Esempio n. 3
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = ReadL();

        var set = new WBMultiSet <long>();

        var c = 0;

        foreach (var v in a)
        {
            var x = v;
            while ((x & 1) == 0)
            {
                x >>= 1;
                c++;
            }
            set.Add(x);
        }

        while (c > 0 && 3 * set.GetFirst() <= set.GetLast())
        {
            c--;
            var x = set.GetFirst();
            set.RemoveAt(0);
            set.Add(x * 3);
        }

        a = set.ToArray();
        var r = a[c % n];

        c /= n;

        while (c-- > 0)
        {
            r *= 3;
        }
        return(r);
    }