@994495jj
2017-05-31T11:45:56.000000Z
字数 1209
阅读 904
(ACM)二分
#include<map>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;const int N=100005;int n,m;int a[4][N];ll sum[4][N];int main() {while(~scanf("%d%d",&n,&m)) {///initmemset(a,0,sizeof(a));memset(sum,0,sizeof(sum));///readfor(int i=1;i<=n;++i) {int w,c;scanf("%d%d",&w,&c);a[w][++a[w][0]]=-c;}///sortfor(int i=1;i<=3;++i) {sort(a[i]+1,a[i]+1+a[i][0]);}///get sumfor(int i=1;i<=3;++i) {for(int j=1;j<=a[i][0];++j) {sum[i][j]=sum[i][j-1]-a[i][j];}}///solvell ans=0;for(int c3=0;c3<=a[3][0];++c3) {//for w==3if(c3*3>m) break;int k=m-c3*3;///binint l=1,r=min(k/2,a[2][0]),c2=0;while(l<=r) {int mid=(l+r)>>1;int t=-a[2][mid];int prec2=mid-1;int prec1=k-prec2*2;if(1<=prec1&&prec1<=a[1][0]) t=t+a[1][prec1];if(1<=prec1-1&&prec1-1<=a[1][0]) t=t+a[1][prec1-1];if(t>0) {c2=mid;l=mid+1;} else {r=mid-1;}}///updint c1=k-c2*2;if(c1>a[1][0]) c1=a[1][0];if(c2>a[2][0]) c2=a[2][0];ans=max(ans,sum[1][c1]+sum[2][c2]+sum[3][c3]);}printf("%I64d\n",ans);}return 0;}
