#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1E5 + 7;
int cpre[N][2], dpre[N][2]; // max, second max
vector<int>coin[N], dim[N];
int main()
{
std::ios::sync_with_stdio(false), cin.tie(0);
int n, c, d;
cin >> n >> c >> d;
for(int i = 1;i <= n;i ++) {
int b, mon;
char cho;
cin >> b >> mon >> cho;
if(cho == 'C') {
coin[mon].push_back(b);
} else {
dim[mon].push_back(b);
}
}
cpre[0][0] = dpre[0][0] = cpre[0][1] = dpre[0][1] = -1E9;
for(int i = 1;i < N;i ++) {
int clen = coin[i].size();
cpre[i][0] = cpre[i - 1][0];
cpre[i][1] = cpre[i - 1][1];
for(int j = 0;j < clen;j ++) {
bool ok = 0;
int tmp = -1;
if(cpre[i][0] <= coin[i][j]) {
ok = 1, tmp = cpre[i][0];
cpre[i][0] = coin[i][j];
}
if(!ok) cpre[i][1] = max(cpre[i][1], coin[i][j]);
else cpre[i][1] = max(cpre[i][1], tmp);
}
}
for(int i = 1;i < N;i ++) {
int dlen = dim[i].size();
dpre[i][0] = dpre[i - 1][0];
dpre[i][1] = dpre[i - 1][1];
for(int j = 0;j < dlen;j ++) {
bool ok = 0;
int tmp = -1;
if(dpre[i][0] <= dim[i][j]) {
ok = 1, tmp = dpre[i][0];
dpre[i][0] = dim[i][j];
}
if(!ok) dpre[i][1] = max(dpre[i][1], dim[i][j]);
else dpre[i][1] = max(dpre[i][1], tmp);
}
}
int ans = 0;
for(int i = 1, j = c - 1;i <= j;i ++ ,j --) {
if(cpre[i][0] == cpre[j][0]) ans = max( {ans, cpre[i][1] + cpre[j][0], cpre[i][0] + cpre[j][1]} );
else ans = max(cpre[i][0] + cpre[j][0], ans);
} //all coin
for(int i = 1, j = d - 1;i <= j;i ++, j --) {
if(dpre[i][0] == dpre[j][0]) ans = max( {ans, dpre[i][1] + dpre[j][0], dpre[i][0] + dpre[j][1]} );
else ans = max(dpre[i][0] + dpre[j][0], ans);
} //all diamond
ans = max(ans, cpre[c][0] + dpre[d][0]);
if(ans < 0) ans = 0;
cout << ans << endl;
return 0;
}
主要是处理好前缀和,最大值和次大值。不知道怎么二分。