示例#1
0
    static void Main()
    {
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => ReadL());

        const int n = 1 << 20;
        var       a = new long[n];

        Array.Fill(a, -1);

        var set = new WBSet <int>();

        for (int i = 0; i < n; i++)
        {
            set.Add(i);
        }

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var q in qs)
        {
            var x  = q[1];
            var xi = x % n;

            if (q[0] == 1)
            {
                var i = set.GetFirstIndex(yi => yi >= xi);
                if (i == set.Count)
                {
                    i = 0;
                }

                var h = set.RemoveAt(i);
                a[h] = x;
            }
            else
            {
                Console.WriteLine(a[xi]);
            }
        }
        Console.Out.Flush();
    }
示例#2
0
    static object Solve()
    {
        var n   = int.Parse(Console.ReadLine());
        var abs = Array.ConvertAll(new bool[n], _ => Read2());

        var a = Array.ConvertAll(abs, p => p.a);
        var b = Array.ConvertAll(abs, p => p.b);
        var s = CumSumL(a);

        // B_i を購入するまでのコストの最小値
        var dp = new long[n + 1];

        // 購入前の所持金に対する最小のインデックス
        var        set = new WBSet <long>();
        var        map = new Dictionary <long, int>();
        const long max = 1L << 60;

        for (int i = 0; i < n; i++)
        {
            var nv = s[i + 1] - dp[i];
            if (set.Count == 0 || set.GetLast() < nv)
            {
                set.Add(nv);
                map[nv] = i;
            }

            if (i > 0 && b[i - 1] > b[i])
            {
                b[i] = b[i - 1];
            }

            var fv = set.GetFirst(x => x >= b[i], max);
            if (fv == max)
            {
                return(-1);
            }
            var j = map[fv];
            dp[i + 1] = dp[j] + b[i];
        }

        return(s[n] - dp[n]);
    }