思路:
把每一组从大到小排序,处理一个前缀和,当前缀和小于0时就看做0。
再把包含数的个数相等的前缀和都加起来,取一个最大值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
#define maxm 100000
#define inf (int)1e9
#define read(x) scanf("%d",&x)
int n,m;
int s[maxn+5],t[maxn+5];
vector<int> Tm[maxn+5];
int sum[maxn+5];
bool cmp(const int& x,const int& y) {
return x>y;
}
int main() {
read(n),read(m);
for(int i=1;i<=n;i++) {
read(t[i]),read(s[i]);
Tm[t[i]].push_back(s[i]);
}
for(int i=1;i<=m;i++) {
sort(Tm[i].begin(),Tm[i].end(),cmp);
for(int j=1;j<Tm[i].size();j++) {
Tm[i][j]+=Tm[i][j-1];
}
for(int j=0;j<Tm[i].size();j++) {
if(Tm[i][j]<=0) break;
sum[j+1]+=Tm[i][j];
}
}
int ans=0;
for(int i=1;i<=n;i++) {
ans=max(ans,sum[i]);
}
printf("%d",ans);
return 0;
}