質問の意味:
個人、m個のプロジェクトnがあり、誰もが選択科目のSIを持っており、値の里への能力、
今や各プロジェクトの容量の最大の合計はいずれかの選択や選択されていない、プロジェクトは同じ番号を必要と選ぶ、あなたのプロジェクトを尋ねる選択されています数
nは、M <= 2E5
アイデア:
降順を考えるように簡単に各被験者を付け、その後、列挙の数を選択します
ANSは、回答のx個の(X)で表される
SUM(x)が0蓄積より大きい場合ANS(x)の各クラスmのクラスを横断する必要があり、プレフィックスのクラスを算出する
、すなわちANS(X)= SUM1(X ) + SUM2(x)は...
この質問のための反復処理する必要が再び蓄積されたデータの範囲があまりにも明らかです
すべての和(x)はANS(X)に添加し、反転させることができると思う
の層を通過する必要がなくなり、算出した現在の接頭辞と接頭辞及び場合和(k)が0より大きい場合、蓄積ANS(K)への回答を
最終的にすべてのANSテイクmaxが答えです
コード:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5;
vector<int>g[maxm];
int ans[maxm];
bool cmp(int a,int b){
return a>b;
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int s,v;
cin>>s>>v;
g[s].push_back(v);
}
int malen=0;
for(int i=1;i<=m;i++){
sort(g[i].begin(),g[i].end(),cmp);
int len=g[i].size();
malen=max(malen,len);
int sum=0;
for(int j=0;j<len;j++){
sum+=g[i][j];
if(sum>0)ans[j+1]+=sum;
else break;
}
}
int res=0;
for(int i=1;i<=malen;i++){
res=max(res,ans[i]);
if(ans[i]==0)break;
}
cout<<res<<endl;
return 0;
}