#include using namespace std; /* int dm_cnt, dm_last; int ce_cnt, ce_last; */ const int MAXN = 6e4; const int INF = 1e9; struct zoo { vector dest_dm; vector dest_ce; } z[MAXN]; int m, n; int comu_dm_s[MAXN]; int comu_dm_d[MAXN]; int comu_ce_s[MAXN]; int comu_ce_d[MAXN]; int memo[10005][10005]; int solve(int index, int rem) { if (rem <= 0) { return index; } if (index > m) { return INF; } int & ret = memo[index][rem]; if (ret != -1) return ret; ret = solve(index + 1, rem); for (int i = 0; i < (int) z[index].dest_dm.size(); i++) { int nxt = z[index].dest_dm[i]; ret = min(ret, solve(nxt, rem - (comu_dm_d[nxt] - (index == 0 ? 0 : comu_dm_s[index - 1])))); } for (int i = 0; i < (int) z[index].dest_ce.size(); i++) { int nxt = z[index].dest_ce[i]; ret = min(ret, solve(nxt, rem - (comu_ce_d[nxt] - (index == 0 ? 0 : comu_ce_s[index - 1])))); } return ret; } vector minimumZooNumbers(vector t, vector s, vector d) { memset(memo, -1, sizeof memo); memset(comu_dm_s, 0, sizeof comu_dm_s); memset(comu_dm_d, 0, sizeof comu_dm_d); memset(comu_ce_s, 0, sizeof comu_ce_s); memset(comu_ce_d, 0, sizeof comu_ce_d); for (int i = 0; i < m; i++) { z[i].dest_dm.clear(); z[i].dest_ce.clear(); } for (int i = 0; i < (int) t.size(); i++) { if (s[i] > d[i]) { continue; } if (t[i] == 'D' || t[i] == 'M') { z[s[i]].dest_dm.push_back(d[i]); comu_dm_s[s[i]]++; comu_dm_d[d[i]]++; } else { comu_ce_s[s[i]]++; comu_ce_d[d[i]]++; z[s[i]].dest_ce.push_back(d[i]); } } for (int i = 0; i <= m; i++) { sort(z[i].dest_dm.begin(), z[i].dest_dm.end()); sort(z[i].dest_ce.begin(), z[i].dest_ce.end()); // cout<