/// <summary> /// 長さ <paramref name="n"/> の数列 a を持つ <see cref="Segtree{TValue, TOp}"/> クラスの新しいインスタンスを作ります。初期値は <see cref="TOp.Identity"/> です。 /// </summary> /// <remarks> /// <para>制約: 0≤<paramref name="n"/>≤10^8</para> /// <para>計算量: O(<paramref name="n"/>)</para> /// </remarks> /// <param name="n">配列の長さ</param> public Segtree(int n) { Length = n; log = InternalBit.CeilPow2(n); size = 1 << log; d = new TValue[2 * size]; Array.Fill(d, op.Identity); }
public Deque(int capacity) { if (capacity <= 8) { capacity = 8; } else { capacity = 1 << (InternalBit.CeilPow2(capacity + 1)); } data = new T[capacity]; mask = capacity - 1; }
public void Simple() { var deque = new Deque <int>(); deque.data.Should().HaveCount(8); deque.Should().HaveCount(0); deque.Invoking(deque => deque.PopLast()).Should().Throw <InvalidOperationException>(); deque.Invoking(deque => deque.PopFirst()).Should().Throw <InvalidOperationException>(); for (int i = 1; i < 8; i++) { deque.AddLast(i); deque.Last.Should().Be(i); deque.data.Should().HaveCount(8); deque.Should().HaveCount(i); } deque.Add(-1); deque.data.Should().HaveCount(16); deque.Should().HaveCount(8); for (int i = deque.Count + 1; i <= 10000; i++) { deque.AddFirst(i); deque.First.Should().Be(i); deque.Last.Should().Be(-1); deque.data.Should().HaveCount(1 << InternalBit.CeilPow2(i + 1)); deque.Should().HaveCount(i); } var cap = 1 << InternalBit.CeilPow2(10000); for (int i = deque.Count - 1; i >= 8; i--) { deque.PopFirst().Should().Be(i + 1); deque.data.Should().HaveCount(cap); deque.Should().HaveCount(i); } deque.PopLast().Should().Be(-1); for (int i = deque.Count - 1; i >= 0; i--) { deque.PopLast().Should().Be(i + 1); deque.data.Should().HaveCount(cap); deque.Should().HaveCount(i); } deque.Invoking(deque => deque.PopLast()).Should().Throw <InvalidOperationException>(); deque.Invoking(deque => deque.PopFirst()).Should().Throw <InvalidOperationException>(); }
/// <summary> /// 使用する <paramref name="xs"/> の値を初期化します。<paramref name="xs"/> はソート済みであること。 /// </summary> public ConvexHullTrick(T[] xs, T xinf, T yinf) { Length = xs.Length; XINF = xinf; YINF = yinf; size = 1 << InternalBit.CeilPow2(Length); int n2 = size << 1; u = new bool[n2]; this.xs = new T[n2]; xs.AsSpan().CopyTo(this.xs); this.xs.AsSpan(Length).Fill(XINF); p = new T[n2]; q = new T[n2]; }
/// <summary> /// 長さ <paramref name="n"/> の数列 a を持つ <see cref="SLazySegtree{TValue, F, TOp}"/> クラスの新しいインスタンスを作ります。初期値は <c>Identity</c> です。 /// </summary> /// <remarks> /// <para>制約: 0≤<paramref name="n"/>≤10^8</para> /// <para>計算量: O(<paramref name="n"/>)</para> /// </remarks> /// <param name="n">配列の長さ</param> public SLazySegtree(int n) { Length = n; log = InternalBit.CeilPow2(n); size = 1 << log; d = new TValue[2 * size]; lz = new F[size]; Array.Fill(d, op.Identity); Array.Fill(lz, op.FIdentity); valSize = new int[2 * size]; Array.Fill(valSize, 1, size, n); for (int i = size - 1; i >= 1; i--) { valSize[i] = valSize[2 * i] + valSize[2 * i + 1]; } }
private static StaticModInt <TMod>[] ConvolutionFFT <TMod>(ReadOnlySpan <StaticModInt <TMod> > a, ReadOnlySpan <StaticModInt <TMod> > b) where TMod : struct, IStaticMod { int n = a.Length, m = b.Length; int z = 1 << InternalBit.CeilPow2(n + m - 1); var a2 = new StaticModInt <TMod> [z]; var b2 = new StaticModInt <TMod> [z]; a.CopyTo(a2); b.CopyTo(b2); var result = ConvolutionFFTInner(a2, b2); Array.Resize(ref result, n + m - 1); var iz = new StaticModInt <TMod>(z).Inv(); for (int i = 0; i < result.Length; i++) { result[i] *= iz; } return(result); }
public Impl(int length) { S = Math.Max(1 << InternalBit.CeilPow2(length), B); S8 = S / 8; }