Problem p02265 (C++) — buggy submission, verdict: Time Limit Exceeded

// 2015/05/26 Tazoe

#include <iostream>
using namespace std;

// Nodeクラス
class Node {
public:
  Node *prev; // 前のノードへのポインタ
  Node *next; // 次のノードへのポインタ
  int data;   // データ
  Node() {
    prev = 0;
    next = 0;
    data = 0;
  } // デフォルトコンストラクタ
};

// Listクラス
class List {
private:
  Node head; // ヘッドノード（ダミー）
public:
  List() {
    head.prev = &head;
    head.next = &head;
  }                    // デフォルトコンストラクタ
  Node *search(int d); // 探索
  int insert(int x);   // 挿入
  int del(int x);      // 削除
  int deleteFirst();   // 先頭の削除
  int deleteLast();    // 末尾の削除
  void print();        // 表示
};

// searchメソッド（探索）
Node *List::search(int d) {
  for (Node *p = head.next; p != &head; p = p->next) {
    if (p->data == d)
      return p; // 見つかった
  }

  return 0; // 見つからなかった
}

// insertメソッド（挿入）
int List::insert(int x) {
  Node *p = new Node();

  if (p == 0)
    return -1; // メモリ確保エラー

  Node *q = &head;
  Node *r = head.next;

  p->prev = q;
  p->next = r;
  p->data = x;

  q->next = p;
  r->prev = p;

  return 0; // 正常終了
}

// delメソッド（削除）
int List::del(int x) {
  Node *p = search(x);

  if (p == 0)
    return -2; // 探索エラー

  Node *q = p->prev;
  Node *r = p->next;

  q->next = r;
  r->prev = q;

  delete p;

  return 0; // 正常終了
}

// deleteFirstメソッド（先頭の削除）
int List::deleteFirst() {
  Node *p = head.next;

  if (p == &head)
    return -2; // 探索エラー

  Node *q = p->prev;
  Node *r = p->next;

  q->next = r;
  r->prev = q;

  delete p;

  return 0; // 正常終了
}

// deleteLastメソッド（末尾の削除）
int List::deleteLast() {
  Node *p = head.prev;

  if (p == &head)
    return -2; // 探索エラー

  Node *q = p->prev;
  Node *r = p->next;

  q->next = r;
  r->prev = q;

  delete p;

  return 0; // 正常終了
}

// printメソッド（表示）
void List::print() {
  for (Node *p = head.next; p != &head; p = p->next) {
    cout << p->data;
    if (p->next == &head) {
      cout << endl;
    } else {
      cout << ' ';
    }
  }
}

// main関数
int main() {
  List L;

  int n;
  cin >> n;

  for (int i = 0; i < n; i++) {
    char com[20];
    cin >> com;

    if (com[0] == 'i') {
      int x;
      cin >> x;

      L.insert(x);
    } else if (com[6] == 'F') {
      L.deleteFirst();
    } else if (com[6] == 'L') {
      L.deleteLast();
    } else {
      int x;
      cin >> x;

      L.del(x);
    }
  }

  L.print();

  return 0;
}

Error: TLE

Fixed submission:

// 2015/05/26 Tazoe

#include <iostream>
#include <string>
using namespace std;

int N[1000001][3];
int np;

// insert関数（挿入）
int insert(int x) {
  int i = np++;

  if (i > 1000000)
    return -1; // エラー

  N[i][0] = 0;
  N[i][1] = N[0][1];
  N[i][2] = x;

  N[N[i][0]][1] = i;
  N[N[i][1]][0] = i;

  return 0; // 正常終了
}

// del関数（削除）
int del(int x) {
  int i;

  for (i = N[0][1]; i != 0; i = N[i][1]) {
    if (N[i][2] == x)
      break;
  }

  if (i == 0)
    return -1; // エラー

  N[N[i][0]][1] = N[i][1];
  N[N[i][1]][0] = N[i][0];

  return 0; // 正常終了
}

// deleteFirst関数（先頭の削除）
int deleteFirst() {
  int i = N[0][1];

  if (i == 0)
    return -1; // エラー

  N[N[i][0]][1] = N[i][1];
  N[N[i][1]][0] = N[i][0];

  return 0; // 正常終了
}

// deleteLast関数（末尾の削除）
int deleteLast() {
  int i = N[0][0];

  if (i == 0)
    return -1; // エラー

  N[N[i][0]][1] = N[i][1];
  N[N[i][1]][0] = N[i][0];

  return 0; // 正常終了
}

// print関数（表示）
void print() {
  for (int i = N[0][1]; i != 0; i = N[i][1]) {
    cout << N[i][2];

    if (N[i][1] == 0) {
      cout << endl;
    } else {
      cout << ' ';
    }
  }
}

// main関数
int main() {
  N[0][0] = 0;
  N[0][1] = 0;
  N[0][2] = 0;

  np = 1;

  int n;
  cin >> n;

  for (int i = 0; i < n; i++) {
    string com;
    cin >> com;

    if (com[0] == 'i') {
      int x;
      cin >> x;

      insert(x);
    } else if (com[6] == 'F') {
      deleteFirst();
    } else if (com[6] == 'L') {
      deleteLast();
    } else {
      int x;
      cin >> x;

      del(x);
    }
  }

  print();

  return 0;
}