Пример #1
0
    public static void Main()
    {
        var nk = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nk[0];
        var k  = nk[1];
        var a  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        //var a = Enumerable.Repeat(0, n).ToArray();
        //nが小さい時注意
        var monoid = new AbelianMonoid <int>((x, y) => x + y, 0);

        for (int count = 0; count < k; count++)
        {
            RangeGetSegmentTree <int> next = new RangeGetSegmentTree <int>(n, monoid);
            for (int i = 0; i < n; i++)
            {
                next.Operate(Max(i - a[i], 0), Min(i + a[i], n - 1), 1);
            }
            var isAllN = true;
            for (int i = 0; i < n; i++)
            {
                a[i] = next[i];
                if (a[i] != n)
                {
                    isAllN = false;
                }
            }
            if (isAllN)
            {
                break;
            }
        }

        Console.WriteLine(string.Join(" ", a));
    }
Пример #2
0
 public RangeGetSegmentTree(int size, AbelianMonoid <T> monoid) : this(size, monoid as Monoid <T>)
 {
     IsCommutative = true;
 }