Esempio n. 1
0
 /// <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);
 }
Esempio n. 2
0
 public Deque(int capacity)
 {
     if (capacity <= 8)
     {
         capacity = 8;
     }
     else
     {
         capacity = 1 << (InternalBit.CeilPow2(capacity + 1));
     }
     data = new T[capacity];
     mask = capacity - 1;
 }
Esempio n. 3
0
        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>();
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 7
0
 public Impl(int length)
 {
     S  = Math.Max(1 << InternalBit.CeilPow2(length), B);
     S8 = S / 8;
 }