Example #1
0
    static object Solve()
    {
        var n  = int.Parse(Console.ReadLine());
        var ps = Array.ConvertAll(new bool[n], _ => Read2());

        var xs  = ps.SelectMany(p => new[] { p.a, p.a + p.b }).ToArray();
        var map = new CompressionHashMap(xs);
        var rev = map.ReverseMap;

        var raq = new StaticRAQ1(map.Count);

        foreach (var(a, b) in ps)
        {
            raq.Add(map[a], map[a + b], 1);
        }
        var s = raq.GetSum();

        var r = new long[n + 1];

        for (int i = 0; i < s.Length - 1; i++)
        {
            r[s[i]] += rev[i + 1] - rev[i];
        }

        return(string.Join(" ", r[1..]));
Example #2
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Read();

        var map = new CompressionHashMap(a);

        var lst = new LST <long, long>(map.Count,
                                       (x, y) => y == -1 ? x : x * y % M, -1,
                                       (x, y) => (x + y) % M, 0,
                                       (x, p, _, l) => x == 0 ? p + 1 : p * x % M);

        var r = 0L;

        foreach (var av in a)
        {
            var v = map[av];

            r += lst.Get(0, v + 1);
            r %= M;

            lst.Set(0, map.Count, 2);
            lst.Set(v, 0);
        }

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

        var p2  = MPows(2, n);
        var p2_ = MPows(MHalf, n);

        var map = new CompressionHashMap(a);
        var bit = new BIT(map.Count);

        var r = 0L;

        for (int i = 0; i < n; i++)
        {
            var v = map[a[i]] + 1;

            r += bit.Sum(v) % M * p2_[n - i];
            r %= M;

            bit.Add(v, p2[n - 1 - i]);
        }

        return(r);
    }
Example #4
0
    static object Solve()
    {
        var(n, m) = Read2L();
        var es = Array.ConvertAll(new bool[m], _ => ReadL());

        var xs = es.Select(e => e[0])
                 .Concat(es.Select(e => e[1]))
                 .Append(1).Append(n)
                 .ToArray();
        var hmap = new CompressionHashMap(xs);
        var n2   = hmap.Count;

        var nes = new List <long[]>();

        foreach (var e in es)
        {
            nes.Add(new[] { hmap[e[0]], hmap[e[1]], e[2] });
        }
        for (int i = 1; i < n2; i++)
        {
            nes.Add(new[] { i - 1, i, hmap.ReverseMap[i] - hmap.ReverseMap[i - 1] });
        }

        var map = ToMap(n2, nes.ToArray(), false);
        var r   = Dijkstra(n2, v => map[v].ToArray(), 0, n2 - 1);

        return(r[^ 1]);
Example #5
0
    static object Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Read();

        var map = new CompressionHashMap(a);
        var m   = map.Count;

        var dpu = new BIT(m);
        var dpd = new BIT(m);

        foreach (var v in a)
        {
            var i = map[v] + 1;

            dpu.Add(i, dpd.Sum(i - 1));
            dpd.Add(i, dpu.Sum(i + 1, m + 1));

            dpu.Add(i, 1);
            dpd.Add(i, 1);

            dpu[i] %= M;
            dpd[i] %= M;
        }

        return((dpu.Sum(m) + dpd.Sum(m) - 2 * n + M) % M);
    }
Example #6
0
    static object Solve()
    {
        var(h, w, n) = Read3();
        var ps = Array.ConvertAll(new bool[n], _ => Read2());

        var xs = Array.ConvertAll(ps, p => p.x);
        var ys = Array.ConvertAll(ps, p => p.y);

        var xmap = new CompressionHashMap(xs);
        var ymap = new CompressionHashMap(ys);

        return(string.Join("\n", Enumerable.Range(0, n).Select(i => $"{xmap[xs[i]] + 1} {ymap[ys[i]] + 1}")));
    }
Example #7
0
    static void Main()
    {
        var(n, m, qc) = Read3();
        var qs = Array.ConvertAll(new bool[qc], _ => Read3());

        var map = new CompressionHashMap(qs.Select(q => q.y).Append(0).Append(-1).ToArray());

        var ab     = new[] { new int[n + 1], new int[m + 1] };
        var counts = Array.ConvertAll(ab, _ => new BIT(map.Count));
        var sums   = Array.ConvertAll(ab, _ => new BIT(map.Count));

        counts[0].Add(map[0], n);
        counts[1].Add(map[0], m);

        var r = 0L;

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var q in qs)
        {
            var(t1, x, y) = q;
            t1--;
            var t2 = 1 - t1;

            var y0 = ab[t1][x];
            var i  = map[y];
            var i0 = map[y0];

            ab[t1][x] = y;
            counts[t1].Add(i0, -1);
            counts[t1].Add(i, 1);
            sums[t1].Add(i0, -y0);
            sums[t1].Add(i, y);

            r -= counts[t2].Sum(i0) * y0;
            r -= sums[t2].Sum(i0 + 1, map.Count + 1);
            r += counts[t2].Sum(i) * y;
            r += sums[t2].Sum(i + 1, map.Count + 1);

            Console.WriteLine(r);
        }
        Console.Out.Flush();
    }
Example #8
0
    static object Solve()
    {
        var(n, k) = ((int, long))Read2L();
        var a = Read();

        var compMap = new CompressionHashMap(a);

        a = compMap.Compressed;
        a = Array.ConvertAll(a, x => x + 1);

        var left = GetLeft(n, k, a);

        var bit = new BIT(n + 1);

        bit[1] = 1;
        for (int i = 0; i < n; i++)
        {
            bit[i + 2] = bit.Sum(left[i] + 1, i + 2) % M;
        }
        return(bit[n + 1]);
    }
Example #9
0
    static string Solve()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Read();

        var map = new CompressionHashMap(a);

        a = map.Compressed;
        var b   = a.Reverse().ToArray();
        var max = map.Count - 1;

        string ReturnValue(int x, int y, int z)
        {
            var r = $"YES\n{x} {y} {z}";

            //var mx = map.Raw.Take(x).Max();
            //var my = map.Raw.Skip(x).Take(y).Min();
            //var mz = map.Raw.Skip(x + y).Take(z).Max();
            //if (mx != my || my != mz)
            //	r += $"\n  {n}\n  " + string.Join(" ", map.Raw);
            return(r);
        }

        // 最大値が3つ以上含まれている場合
        var maxIndexes = Enumerable.Range(0, n).Where(i => a[i] == max).ToArray();

        if (maxIndexes.Length >= 3)
        {
            return(ReturnValue(maxIndexes[1], 1, n - maxIndexes[1] - 1));
        }
        // 最小値
        if (a[0] == 0 && a[^ 1] == 0 && a.Count(v => v == 0) >= 3)
        {
            return(ReturnValue(1, n - 2, 1));
        }

        var max1 = a.CumMax();
        var max2 = b.CumMax();

        (int x, bool dup)[] Tally(int[] a, int[] cummax)
Example #10
0
    static object Solve()
    {
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => Read4());

        var xMap = new CompressionHashMap(qs.SelectMany(q => new[] { q.a, q.c }).ToArray());
        var yMap = new CompressionHashMap(qs.SelectMany(q => new[] { q.b, q.d }).ToArray());

        var n2 = 1;

        while (n2 < yMap.Count << 1)
        {
            n2 <<= 1;
        }

        var st  = new ST1 <long>(yMap.Count, (x, y) => x + y, 0, Enumerable.Range(0, yMap.Count - 1).Select(i => (long)yMap.ReverseMap[i + 1] - yMap.ReverseMap[i]).ToArray());
        var lst = new LST <bool, long>(yMap.Count,
                                       (x, y) => x ^ y, false,
                                       (x, y) => x + y, 0,
                                       (b, p, node, l) => st.Get(node.LastLeft(l).i - (n2 >> 1), node.LastRight(l).i - (n2 >> 1)) - p);

        var qd = qs
                 .SelectMany(q => new[] { (add: true, x: q.a, q.b, q.d), (add: false, x: q.c, q.b, q.d) })
Example #11
0
    static object Solve()
    {
        var(n, m) = Read2();
        var ls_x = Array.ConvertAll(new bool[n], _ => Read3L());
        var ls_y = Array.ConvertAll(new bool[m], _ => Read3L());

        // 柵に使われる座標
        var xs = new List <long> {
            0, -1 << 30, 1 << 30
        };
        var ys = new List <long> {
            0, -1 << 30, 1 << 30
        };

        foreach (var(a, b, c) in ls_x)
        {
            xs.Add(a);
            xs.Add(b);
            ys.Add(c);
        }
        foreach (var(d, e, f) in ls_y)
        {
            xs.Add(d);
            ys.Add(e);
            ys.Add(f);
        }
        var xmap = new CompressionHashMap(xs.ToArray());
        var ymap = new CompressionHashMap(ys.ToArray());

        var lineMap_x = GridMap.Create(xmap.Count - 1, ymap.Count, false);
        var lineMap_y = GridMap.Create(xmap.Count, ymap.Count - 1, false);

        foreach (var(a, b, c) in ls_x)
        {
            var j = ymap[c];
            for (int i = xmap[a]; i < xmap[b]; i++)
            {
                lineMap_x[i, j] = true;
            }
        }
        foreach (var(d, e, f) in ls_y)
        {
            var i = xmap[d];
            for (int j = ymap[e]; j < ymap[f]; j++)
            {
                lineMap_y[i, j] = true;
            }
        }

        var(h, w) = (xmap.Count - 1, ymap.Count - 1);
        var uf = new GridUF(h, w);

        for (int i = 0; i < h; i++)
        {
            for (int j = 1; j < w; j++)
            {
                if (!lineMap_x[i, j])
                {
                    uf.Unite(new Point(i, j - 1), new Point(i, j));
                }
            }
        }
        for (int j = 0; j < w; j++)
        {
            for (int i = 1; i < h; i++)
            {
                if (!lineMap_y[i, j])
                {
                    uf.Unite(new Point(i - 1, j), new Point(i, j));
                }
            }
        }

        Point sv = (xmap[0], ymap[0]);
        Point ev = (0, 0);

        if (uf.AreUnited(sv, ev))
        {
            return("INF");
        }

        var delta_x = new long[h];
        var delta_y = new long[w];

        for (int i = 0; i < h; i++)
        {
            delta_x[i] = xmap.ReverseMap[i + 1] - xmap.ReverseMap[i];
        }
        for (int j = 0; j < w; j++)
        {
            delta_y[j] = ymap.ReverseMap[j + 1] - ymap.ReverseMap[j];
        }

        var area = 0L;

        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                if (uf.AreUnited(sv, new Point(i, j)))
                {
                    area += delta_x[i] * delta_y[j];
                }
            }
        }
        return(area);
    }
Example #12
0
    static object Solve()
    {
        var(n, m) = Read2();
        var ls_x = Array.ConvertAll(new bool[n], _ => Read3L());
        var ls_y = Array.ConvertAll(new bool[m], _ => Read3L());

        var xs = new List <long> {
            0, -1 << 30, 1 << 30
        };
        var ys = new List <long> {
            0, -1 << 30, 1 << 30
        };

        foreach (var(a, b, c) in ls_x)
        {
            xs.Add(a);
            xs.Add(b);
            ys.Add(c);
        }
        foreach (var(d, e, f) in ls_y)
        {
            xs.Add(d);
            ys.Add(e);
            ys.Add(f);
        }
        var xmap = new CompressionHashMap(xs.ToArray());
        var ymap = new CompressionHashMap(ys.ToArray());

        var map       = GridMap.Create(xmap.Count - 1, ymap.Count - 1, 0L);
        var lineMap_x = GridMap.Create(xmap.Count - 1, ymap.Count, false);
        var lineMap_y = GridMap.Create(xmap.Count, ymap.Count - 1, false);

        // lines
        foreach (var(a, b, c) in ls_x)
        {
            var(ai, bi, cj) = (xmap[a], xmap[b], ymap[c]);
            for (int i = ai; i < bi; i++)
            {
                lineMap_x[i, cj] = true;
            }
        }
        foreach (var(d, e, f) in ls_y)
        {
            var(di, ej, fj) = (xmap[d], ymap[e], ymap[f]);
            for (int j = ej; j < fj; j++)
            {
                lineMap_y[di, j] = true;
            }
        }

        // regions
        for (int i = 0; i < map.Height; i++)
        {
            var th = xmap.ReverseMap[i + 1] - xmap.ReverseMap[i];
            for (int j = 0; j < map.Width; j++)
            {
                map[i, j] = th * (ymap.ReverseMap[j + 1] - ymap.ReverseMap[j]);
            }
        }

        var uf = new GridUF(map.Height, map.Width);

        for (int i = 0; i < map.Height; i++)
        {
            for (int j = 1; j < map.Width; j++)
            {
                if (!lineMap_x[i, j])
                {
                    uf.Unite(new Point(i, j - 1), new Point(i, j));
                }
            }
        }
        for (int j = 0; j < map.Width; j++)
        {
            for (int i = 1; i < map.Height; i++)
            {
                if (!lineMap_y[i, j])
                {
                    uf.Unite(new Point(i - 1, j), new Point(i, j));
                }
            }
        }

        Point sv = (xmap[0], ymap[0]);
        Point ev = (0, 0);

        if (uf.AreUnited(sv, ev))
        {
            return("INF");
        }

        var area = 0L;

        for (int i = 0; i < map.Height; i++)
        {
            for (int j = 0; j < map.Width; j++)
            {
                if (uf.AreUnited(sv, new Point(i, j)))
                {
                    area += map[i, j];
                }
            }
        }
        return(area);
    }
Example #13
0
    static void Main()
    {
        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        var(n, m, qc) = Read3();
        var qs = Array.ConvertAll(new bool[qc], _ => Read3());

        var map = new CompressionHashMap(qs.Select(q => q.y).Append(0).ToArray());

        var a = new int[n];
        var b = new int[m];

        var a_count = new ST1 <long>(map.Count, (x, y) => x + y, 0);
        var b_count = new ST1 <long>(map.Count, (x, y) => x + y, 0);

        var a_sum = new ST1 <long>(map.Count, (x, y) => x + y, 0);
        var b_sum = new ST1 <long>(map.Count, (x, y) => x + y, 0);

        a_count.Set(map[0], n);
        b_count.Set(map[0], m);

        var r = 0L;

        foreach (var(t, x, y) in qs)
        {
            var j = x - 1;

            if (t == 1)
            {
                var y0 = a[j];
                var i  = map[y];
                var i0 = map[y0];

                var sum0 = y0 * b_count.Get(map[0], i0) + b_sum.Get(i0, map.Count);
                var sum  = y * b_count.Get(map[0], i) + b_sum.Get(i, map.Count);
                r += sum - sum0;

                a[j] = y;
                a_count.Set(i0, a_count.Get(i0) - 1);
                a_count.Set(i, a_count.Get(i) + 1);
                a_sum.Set(i0, a_sum.Get(i0) - y0);
                a_sum.Set(i, a_sum.Get(i) + y);
            }
            else
            {
                var y0 = b[j];
                var i  = map[y];
                var i0 = map[y0];

                var sum0 = y0 * a_count.Get(map[0], i0) + a_sum.Get(i0, map.Count);
                var sum  = y * a_count.Get(map[0], i) + a_sum.Get(i, map.Count);
                r += sum - sum0;

                b[j] = y;
                b_count.Set(i0, b_count.Get(i0) - 1);
                b_count.Set(i, b_count.Get(i) + 1);
                b_sum.Set(i0, b_sum.Get(i0) - y0);
                b_sum.Set(i, b_sum.Get(i) + y);
            }
            Console.WriteLine(r);
        }
        Console.Out.Flush();
    }
Example #14
0
    static void Main()
    {
        var(n, qc) = Read2();
        var a  = Read();
        var qs = Array.ConvertAll(new bool[qc], _ => Read3());

        var vs = a.ToList();

        foreach (var(t, x, y) in qs)
        {
            if (t == 1)
            {
                vs.Add(y);
            }
        }
        var vMap = new CompressionHashMap(vs.ToArray());

        // キーの値となりうるインデックスのリスト
        var map0 = Array.ConvertAll(new bool[vMap.Count], _ => new List <int>());

        for (int i = 0; i < n; i++)
        {
            map0[vMap[a[i]]].Add(i);
        }

        foreach (var(t, x, y) in qs)
        {
            if (t == 1)
            {
                map0[vMap[y]].Add(x - 1);
            }
        }

        var map = Array.ConvertAll(map0, l =>
        {
            var b = l.ToArray();
            Array.Sort(b);
            return(b);
        });
        var u      = Array.ConvertAll(map, p => new bool[p.Length]);
        var mapInv = Array.ConvertAll(map, p => ToInverseMap(p));

        for (int i = 0; i < n; i++)
        {
            u[vMap[a[i]]][mapInv[vMap[a[i]]][i]] = true;
        }

        var st = new ST1 <int>(n, Math.Min, int.MaxValue, a);

        var r = new List <int>();

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var q in qs)
        {
            var(t, x, y) = q;
            x--;

            if (t == 1)
            {
                u[vMap[a[x]]][mapInv[vMap[a[x]]][x]] = false;
                a[x] = y;
                st.Set(x, y);
                u[vMap[a[x]]][mapInv[vMap[a[x]]][x]] = true;
            }
            else
            {
                r.Clear();

                var p    = st.Get(x, y);
                var inds = map[vMap[p]];
                var j0   = First(0, inds.Length, j => inds[j] >= x);

                for (int j = j0; j < inds.Length && inds[j] < y; j++)
                {
                    if (u[vMap[p]][j])
                    {
                        r.Add(inds[j] + 1);
                    }
                }
                Console.WriteLine($"{r.Count} " + string.Join(" ", r));
            }
        }
        Console.Out.Flush();
    }