3161. Деки на 6 мегабайтах

 

Напишите программу, которая умеет оперировать с большим количеством деков. Дек – это очередь с двумя концами.

 

Вход. Первая строка содержит общее количество команд n (0 ≤ n ≤ 150000). Каждая из следующих n строк содержит описание команды:

·        pushfront A B – вставить число B в начало дека A;

·        pushback A B – вставить число B в конец дека A;

·        popfront A – удалить первый элемент дека A;

·        popback A – удалить последний элемент дека A.

Для каждой команды параметры A и B – целые числа от 1 до 150000 включительно.

 

Выход. Для каждой команды popfront или popback выведите удаляемое число. Гарантируется, что перед выполнением команды удаления соответствующий дек не пуст.

 

Пример входа

Пример выхода

9

pushfront 1 71819

pushback 2 71820

pushback 1 1

popfront 1

popfront 1

pushfront 2 10

pushback 2 11

popback 2

popback 2

71819

1

11

71820

 

 

 

РЕШЕНИЕ

структуры данных - очередь

 

Анализ алгоритма

Поскольку параметр A не более 150000, то очередей будет не более 150000. Объявим массив из 150000 структур deque. Промоделируем работу очередей.

 

Реализация алгоритма

Объявим массив очередей.

 

deque<int> q[150001];

 

Читаем количество команд n.

 

cin >> n;

while (n--)

{

 

Читаем и обрабатываем текущую команду.

 

  cin >> s >> a;

  if (s == "pushback")

  {

    cin >> b;

    q[a].push_back(b);

  }

  if (s == "pushfront")

  {

    cin >> b;

    q[a].push_front(b);

  }

  if (s == "popfront")

  {

    cout << q[a].front() << endl;

    q[a].pop_front();

  }

  if (s == "popback")

  {

    cout << q[a].back() << endl;

    q[a].pop_back();

  }

}

 

Реализация алгоритма – собственный класс

Реализуем класс очередь.

 

class deque

{

private:

  struct node

  {

    int data;

    node *next, *prev;

 

    node()

    {

      prev = next = NULL;

    }

 

    node(int a)

    {

      data = a;

      prev = next = NULL;

    }

  } *Head, *Tail;

 

public:

  deque()

  {

    Head = Tail = NULL;

  }

 

  void push_back(int a)

  {

    node *p = new node(a);

    if(Head == NULL)

      Head = Tail = p;

    else

    {

      p->prev = Tail;

      p->next = NULL;

      Tail->next = p;

      Tail = p;

    }

  }

 

  void push_front(int a)

  {

    node *p = new node(a);

    if(Head == NULL)

      Head = Tail = p;

    else

    {

      p->next = Head;

      p->prev = NULL;

      Head->prev = p;

      Head = p;

    }

  }

 

  int pop_front(void)

  {

    node *p = Head;

    int r = Head->data;

    if(Head == Tail)

      Head = Tail = NULL;

    else

    {

      Head = Head->next;

      Head->prev = NULL;

    }

    delete p;

    return r;

  }

 

  int pop_back(void)

  {

    node *p = Tail;

    int r = Tail->data;

    if(Head == Tail)

      Head = Tail = NULL;

    else

    {

      Tail = Tail->prev;

      Tail->next = NULL;

    }

    delete p;

    return r;

  }

 

  int empty(void)

  {

    return Head == NULL;

  }

 

  int front(void)

  {

    return Head->data;

  }

 

  int back(void)

  {

    return Tail->data;

  }

};

 

Объявим массив классов.

 

#define MAX 150001

deque q[MAX];

 

Основная часть программы. Читаем входные данные и моделируем работу очередей.

 

scanf("%d\n",&n);

while(n--)

{

  scanf("%s %d",s,&a);

  if(!strcmp(s,"pushback"))

  {

    scanf("%d\n",&b);

    q[a].push_back(b);

  }

  if(!strcmp(s,"pushfront"))

  {

    scanf("%d\n",&b);

    q[a].push_front(b);

  }

  if(!strcmp(s,"popfront"))

  {

    scanf("\n");

    printf("%d\n",q[a].front());

    q[a].pop_front() ;

  }

  if(!strcmp(s,"popback"))

  {

    scanf("\n");

    printf("%d\n",q[a].back());

    q[a].pop_back();

  }

}

 

Java реализация

 

import java.util.*;

 

public class Main

{

  static Deque<Integer> q[];

 

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    q = new LinkedList[150001];

    for(int i = 0; i < 150001; i++)

      q[i] = new LinkedList<Integer>();

   

    int n = con.nextInt();

    while (n-- > 0)

    {

      String s = con.next();

      int a = con.nextInt();

      if (s.equals("pushback"))

      {

      int b = con.nextInt();

        q[a].addLast(b);

      }

      if (s.equals("pushfront"))

      {

      int b = con.nextInt();

      q[a].addFirst(b);

      }    

      if (s.equals("popback"))

      {

        System.out.println(q[a].removeLast());

      }

      if (s.equals("popfront"))

      {

        System.out.println(q[a].removeFirst());

      }

    }

    con.close();

  }

}