Операция MEX, не укладываюсь в 3 секунды - C# [требует правки]

200
17 октября 2017, 00:19

Операция MEX, не укладываюсь в 3 секунды - C#

Операция MEX для набора целых неотрицательных чисел возвращает наименьшее неотрицательное целое число, не содержащееся в наборе. Например, для набора (0, 1, 2, 2, 4, 4, 11) это значение равно 3, для набора (1, 1, 2, 5, 7) это значение равно 0, а для набора (0, 1, 2, 2, 2, 3) это значение равно 4. В наборе могут встречаться одинаковые числа. Вам задана последовательность из нескольких операций одного из двух видов:

  • x — добавить число x в набор.
  • x — удалить одно вхождение числа x из набора (если числа x в наборе нет, то операция игнорируется). Изначально набор пуст. Вам необходимо вывести значение MEX для набора после применения каждой из операций. Операции выполняются последовательно одна за другой.

Входные данные В первой строке содержится число n — количество операций (1 ≤ n ≤ 150000). В следующих n строках содержатся операции, по одной в строке. Операция может быть одного из двух видов:

  • x — добавить число x в набор (0 ≤ x ≤ 109).
  • x — удалить одно вхождение числа x из набора. Знак операции и число разделены единичным пробелом. Выходные данные Выведите n чисел через пробел — значение MEX для набора после применения каждой из указанных операций.

Примеры:

входные данные

7
+ 2
+ 1
+ 0
+ 4
+ 2
- 2
- 2

выходные данные

0 0 3 3 3 3 2

входные данные

6
+ 0
+ 1
+ 0
- 1
- 0
- 0

выходные данные

1 2 2 1 1 0

Мое решение:

        List<int> mex = new List<int>();
        Dictionary<int, int> bag = new Dictionary<int, int>();
        for (int i = Int32.Parse(Console.ReadLine()); i > 0; --i)
        {
            string[] s = Console.ReadLine().Split();
            int x = Int32.Parse(s[1]);
            int n;
            if (!bag.TryGetValue(x, out n)) n = 0;
            n += s[0] == "+" ? 1 : -1;
            if (n > 0)
            {
                bag[x] = n;
            }
            else if (n == 0)
            {
                bag.Remove(x);
            }
            x = 0;
            while (bag.ContainsKey(x)) ++x;
            mex.Add(x);
        }
        Console.WriteLine(String.Join(" ", mex));

Я переписал программу, но все равно чуть-чуть не укладываюсь

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp183
{
class Program
{
    static void Main(string[] args)
    {
        List<int> introw = new List<int>();
        List<int> intresult = new List<int>();
        int min = 0;
        int x = 0;
        int n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            string current = Console.ReadLine();
            if (current.Substring(0, 1) == "+")
            {
                x = int.Parse(current.Substring(1, current.Length - 1));
                introw.Add(x);
                if (x == min)
                {
                    while (introw.Contains(min))
                    {
                        min++;
                    }
                }
            }
            else
            {
                x = int.Parse(current.Substring(1, current.Length - 1));
                introw.Remove(x);
                if ((x < min) && (introw.Contains(x) == false))
                {
                    min = x;
                }
            }
            intresult.Add(min);
        }
        for (int i = 0; i < intresult.Count; i++)
        {
            Console.Write(intresult[i]);
            if (i != n - 1)
            {
                Console.Write(" ");
            }
        }
        Console.ReadLine();
    }
}
}
READ ALSO
Программное управление Tor в Windows

Программное управление Tor в Windows

Ищу способ сменить выходную ноду тора программно из c#Ну и было бы здорово узнать как указать определенные страны выходной ноды программно,...

221
jquery события выделения

jquery события выделения

У меня есть тег <textarea></textarea> в который с ввожу текст

228