Problem:
鉄道路線II

わたしの住む街には、図のような N 個の駅からなる円環状の鉄道路線があります。この路線の各駅には 0 から N-1 までの番号が順番に割り当てられていて、隣の駅まで100 円で移動することができます。移動はどちらの方向にでも可能です。

わたしはこの路線上のいくつかの駅で買い物をしたいと思っています。そこで、プログラムを作成して移動費を計算することにしました。ある駅を始点として、買い物をするすべての駅を訪問する最小の費用（円）を求めるプログラムを作成してください。ただし、同じ駅を何度訪問しても良く、どのような順番で駅を訪問しても構いません。

入力

入力は以下の形式で与えられる。

N M p
d1
d2
:
dM

1行目に駅の数 N (2 ≤ N ≤ 100000)、買い物をする駅の数 M (1 ≤ M ≤ 10000 かつ M < N)、出発する駅の番号 p (0 ≤ p ≤ N-1) が与えられる。続く M 行に買い物をする駅の番号 di (0 ≤ di ≤ N-1) が与えられる。ただし、diは全て異なり、p もまたどの di とも異なるものとする。

出力

最小の費用を１行に出力する。

入出力例

入力例１

5 4 0
1
2
3
4

出力例１

400

入力例２

7 2 1
6
2

出力例２

400

Solution in C++ (judge verdict: Memory Limit Exceeded)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <math.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <string>
using namespace std;
#define rep(I,N) for(int I = 0; I < (int)(N); I++)
#define FIN(V) cout<<V<<endl
#define pb push_back
#define INF (1 << 30)
typedef pair<int, int> P;
typedef long long ll;
typedef priority_queue<int> pq;
int N, M, NOW;
int d[10001];
struct Data{
	int cost, pos;
	Data(int _cost, int _pos){
		cost = _cost;
		pos = _pos;
	}
	Data(){}
};
int StrToInt(string s){
	stringstream ss;
	ss << s;
	int val;
	ss >> val;
	return val;
}
string IntToStr(int i){
	stringstream ss;
	ss << i;
	return ss.str();
}
string StrEra(string S, int i){
	string L = IntToStr(i);
	int a = S.find(L);
	S.erase(a, 1);
	return S;
}

typedef pair<Data, vector<int> > vD;
int main(void){
	cin >> N >> M >> NOW;
	vector<int> v;
	fill_n(d, 10001, -1);
	rep(i, M){
		int a;
		cin >> a;
		d[a] = a;
		v.push_back(a);
	}
	sort(v.begin(), v.end());
	queue<vD> que;
	que.push(vD(Data(0, NOW), v));
	int mini = 1000000000;
	while(!que.empty()){
		vD data = que.front();
		que.pop();
		int pos = data.first.pos;
		int cost = data.first.cost;
		//cout << "pos:" << pos << endl;
		vector<int> now = data.second;
		if(mini <= cost)continue;
		if(now.empty()){
			mini = min(mini, cost);
		}
		int p_pos = pos-1;
		int cnt = 1;
		if(p_pos == -1)p_pos = N-1;
		while(1){
			if(d[p_pos] != -1)break;
			cnt++;
			p_pos--;
			if(p_pos == -1)p_pos = N-1;
		}
		int next_cost = cost+(cnt*100);
		vector<int> backup = now;
		//cout << "p_pos: " << p_pos << endl;
		//cout << "next_cost:" << next_cost << endl;
		now.erase(remove(now.begin(), now.end(), d[p_pos]), now.end());
		que.push(vD(Data(next_cost, p_pos), now));

		int n_pos = pos+1;
		cnt = 1;
		if(n_pos == N)n_pos = 0;
		while(1){
			if(d[n_pos] != -1)break;
			cnt++;
			n_pos++;
			if(n_pos == N)n_pos = 0;
		}
		next_cost = cost+(cnt*100);
		//cout << "n_pos: " << n_pos << endl;
		//cout << "next_cost:" << next_cost << endl;
		backup.erase(remove(backup.begin(), backup.end(), d[n_pos]), backup.end());
		que.push(vD(Data(next_cost, n_pos), backup));
	}
	FIN(mini);

	return 0;	
}

/*

v.erase(remove(v.begin(), v.end(), 3), v.end());

  string str( "abcdefghijk" );
  char key = 'h';
  cout << str.find(key) << endl;???// 7

 	string str( "abcdefghijk" );
	char key = 'z';

	if( str.find(key) == string::npos ) {
	  cout << "Not Found" << endl;
	}
str.erase(str.begin()+3);    // "abcefghijk"

*/