链接: http://codeforces.com/contest/799/problem/C
思路: 二分+ 后缀
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > pii;
const int N =1e5+5;
const int inf =0x3f3f3f3f;
//vector<pii>a,b;
pii a[N],b[N];
int A,B;
int ca,cb;
int Ans;
int n;
int post1[N];
int post2[N];
bool cmp(pii x,pii y)
{
if(x.first==y.first) return x.second<y.second;
return x.first<y.first;
}
int juddd(int aim)
{
post2[cb]=b[cb].second;
for(int i=cb-1;i>=1;i--){
post2[i]=min(b[i].second,post2[i+1]);
}
for(int i=1;i<=cb;i++){
if(b[i].second>=B) continue;
int be=aim-b[i].first;
int in=-1;
int l,r,mid;
l=i+1;r=cb;
while(l<=r){
mid=(l+r)>>1;
if(b[mid].first>=be){
in=mid;
r=mid-1;
}
else l=mid+1;
}
if(in==-1) continue;
if(b[i].second+post2[in]<=B) return 1;
}
return 0;
}
void DD()
{
int l=0;
int r=inf;
int tmp=0;
while(l<=r){
int mid=(l+r)>>1;
if(juddd(mid)){
tmp=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
Ans=max(Ans,tmp);
}
int judcc(int aim)
{
post1[ca]=a[ca].second;
for(int i=ca-1;i>=1;i--){
post1[i]=min(a[i].second,post1[i+1]);
}
for(int i=1;i<=ca;i++){
if(a[i].second>=A) continue;
int be=aim-a[i].first;
int l,r,in,mid;
in=-1;
l=i+1; r=ca;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].first>=be){
in=mid;
r=mid-1;
}
else l=mid+1;
}
if(in==-1) continue;
if(a[i].second+post1[in]<=A) return 1;
}
return 0;
}
void CC()
{
int l=0,r=inf;
int tmp=0;
int mid;
while(l<=r){
mid=(l+r)>>1;
if(judcc(mid)){
tmp=mid;
l=mid+1;
}
else r=mid-1;
}
Ans=max(Ans,tmp);
}
void CD()
{
int tmp1=0;
int tmp2=0;
for(int i=1;i<=ca;i++){
if(a[i].second<=A&&a[i].first>tmp1){
tmp1=a[i].first;
}
}
for(int i=1;i<=cb;i++){
if(b[i].second<=B&&b[i].first>tmp2){
tmp2=b[i].first;
}
}
if(tmp1!=0&&tmp2!=0){
Ans=max(Ans,tmp1+tmp2);
}
}
int main()
{
cin>>n>>A>>B;
int be,cost;
char op[5];
for(int i=1;i<=n;i++){
scanf("%d %d %s",&be,&cost,op);
if(op[0]=='C'){
a[++ca].first=be; a[ca].second=cost;
}
else{
b[++cb].first=be; b[cb].second=cost;
}
}
sort(a+1,a+ca+1,cmp);
sort(b+1,b+cb+1,cmp);
CC();
DD();
CD();
printf("%d\n",Ans);
return 0;
}
/*
3 5 5
10 2 D
15 3 D
1 30 C
*/