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)); }
public RangeGetSegmentTree(int size, AbelianMonoid <T> monoid) : this(size, monoid as Monoid <T>) { IsCommutative = true; }