Problem p03357 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define N 2005
#define ll long long
#define debug(a)                                                               \
  cout << #a << ": ";                                                          \
  for (auto i : a)                                                             \
    cout << i << " ";                                                          \
  cout << endl;
#define trace(a) cout << #a << ": " << a << endl;

pair<int, int> a[N];
string t[N];
int dp[N][N], psb[N][N], psw[N][N], pos[N][N];
int n;
int rec(int b, int w) {
  if (b == 0 && w == 0) {
    return 0;
  }
  if (dp[b][w] != -1)
    return dp[b][w];
  // vector<pair<int,int> > v;
  // for(int i = 0;i < 2*n;i++) {
  // 	if(a[i].second == 1) {
  // 		if(a[i].first > n-b) {
  // 			v.push_back(a[i]);
  // 		}
  // 	}
  // 	else {
  // 		if(a[i].first > n-w) {
  // 			v.push_back(a[i]);
  // 		}
  // 	}
  // }
  // trace(v.size());
  int ans = 1e9;
  if (b > 0) {
    int index = pos[1][n - b + 1];
    int cnt = psw[index][n - w] + psb[index][n - b + 1];
    // for(auto it : v) {

    // 	if(it.second == 1 && it.first == n-b+1) {
    // 		break;
    // 	}
    // 	cnt++;
    // }
    ans = min(ans, rec(b - 1, w) + cnt);
  }
  if (w > 0) {
    int index = pos[2][n - w + 1];
    int cnt = psb[index][n - b] + psw[index][n - w + 1];
    // for(auto it : v) {
    // 	if(it.second == 2 && it.first == n-w+1) {
    // 		break;
    // 	}
    // 	cnt++;
    // }
    ans = min(ans, rec(b, w - 1) + cnt);
  }
  // cout << b << " " << w << " " << ans << endl;
  return dp[b][w] = ans;
}
// int solve(int n) {
// 	int i,j,k,l,m;
// 	int ans = 0;
// 	for(i = 0;i < 2*n;i++) {
// 		for(j = i - 1;j >= 0;j--) {
// 			if(mark[j]) continue;
// 			if(t[i] == t[j]) {
// 				if(a[j] > a[i]) {

// 				}
// 			}

// 		}
// 	}
// 	return ans;
// }
int main() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  int i, j, k, l, m;
  cin >> n;
  for (i = 0; i < 2 * n; i++) {
    cin >> t[i] >> a[i].first;
    if (t[i] == "B") {
      a[i].second = 1;
    } else {
      a[i].second = 2;
    }
    pos[a[i].second][a[i].first] = i;
  }
  for (int w = 0; w <= n; w++) {
    for (i = 0; i < 2 * n; i++) {
      if (i > 0)
        psw[i][w] = psw[i - 1][w];
      if (a[i].second == 2 && a[i].first > w) {
        psw[i][w]++;
      }
    }
  }
  for (int b = 0; b <= n; b++) {
    for (i = 0; i < 2 * n; i++) {
      if (i > 0)
        psb[i][b] = psb[i - 1][b];
      if (a[i].second == 1 && a[i].first > b) {
        psb[i][b]++;
      }
    }
  }
  memset(dp, -1, sizeof(dp));
  cout << rec(n, n) << endl;
  // int an = min(rec(n,n,0),rec(n,n,1));
  // cout << an << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define N 2005
#define ll long long
#define debug(a)                                                               \
  cout << #a << ": ";                                                          \
  for (auto i : a)                                                             \
    cout << i << " ";                                                          \
  cout << endl;
#define trace(a) cout << #a << ": " << a << endl;

pair<int, int> a[2 * N];
string t[2 * N];
int dp[N][N], psb[2 * N][N], psw[2 * N][N], pos[3][N];
int n;
int rec(int b, int w) {
  if (b == 0 && w == 0) {
    return 0;
  }
  if (dp[b][w] != -1)
    return dp[b][w];
  // vector<pair<int,int> > v;
  // for(int i = 0;i < 2*n;i++) {
  // 	if(a[i].second == 1) {
  // 		if(a[i].first > n-b) {
  // 			v.push_back(a[i]);
  // 		}
  // 	}
  // 	else {
  // 		if(a[i].first > n-w) {
  // 			v.push_back(a[i]);
  // 		}
  // 	}
  // }
  // trace(v.size());
  int ans = 1e9;
  if (b > 0) {
    int index = pos[1][n - b + 1];
    int cnt = psw[index][n - w] + psb[index][n - b + 1];
    // for(auto it : v) {

    // 	if(it.second == 1 && it.first == n-b+1) {
    // 		break;
    // 	}
    // 	cnt++;
    // }
    ans = min(ans, rec(b - 1, w) + cnt);
  }
  if (w > 0) {
    int index = pos[2][n - w + 1];
    int cnt = psb[index][n - b] + psw[index][n - w + 1];
    // for(auto it : v) {
    // 	if(it.second == 2 && it.first == n-w+1) {
    // 		break;
    // 	}
    // 	cnt++;
    // }
    ans = min(ans, rec(b, w - 1) + cnt);
  }
  // cout << b << " " << w << " " << ans << endl;
  return dp[b][w] = ans;
}
// int solve(int n) {
// 	int i,j,k,l,m;
// 	int ans = 0;
// 	for(i = 0;i < 2*n;i++) {
// 		for(j = i - 1;j >= 0;j--) {
// 			if(mark[j]) continue;
// 			if(t[i] == t[j]) {
// 				if(a[j] > a[i]) {

// 				}
// 			}

// 		}
// 	}
// 	return ans;
// }
int main() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  int i, j, k, l, m;
  cin >> n;
  for (i = 0; i < 2 * n; i++) {
    cin >> t[i] >> a[i].first;
    if (t[i] == "B") {
      a[i].second = 1;
    } else {
      a[i].second = 2;
    }
    pos[a[i].second][a[i].first] = i;
  }
  for (int w = 0; w <= n; w++) {
    for (i = 0; i < 2 * n; i++) {
      if (i > 0)
        psw[i][w] = psw[i - 1][w];
      if (a[i].second == 2 && a[i].first > w) {
        psw[i][w]++;
      }
    }
  }
  for (int b = 0; b <= n; b++) {
    for (i = 0; i < 2 * n; i++) {
      if (i > 0)
        psb[i][b] = psb[i - 1][b];
      if (a[i].second == 1 && a[i].first > b) {
        psb[i][b]++;
      }
    }
  }
  memset(dp, -1, sizeof(dp));
  cout << rec(n, n) << endl;
  // int an = min(rec(n,n,0),rec(n,n,1));
  // cout << an << endl;
}