一个比较麻烦的模拟...
#include <bits/stdc++.h> using namespace std; const int N=2e5+5; struct vv{ int id,t; bool operator<(const vv &b)const{ return b.t==t?id<b.id:t<b.t; } }a[4][N]; int k,m,n; int need; int num[4];//4个id的指针. set<vv>all,choose;//确实没有这个实力写这种模拟题... int sum[4][N]; int cnt=0; void range(int x) { if(x<=k)//A B会改变. { need=m-x-(2*(k-x)); if(k-x+1<=num[1]) all.insert(a[1][k-x+1]); if(k-x+1<=num[2]) all.insert(a[2][k-x+1]); }else need=m-x; } void upch() { if(need<0) need=0; set<vv>::iterator it; while(choose.size()>need) it=--choose.end(),cnt-=it->t,all.insert(*it),choose.erase(it); while(choose.size()<need&&all.size()) cnt+=(it=all.begin())->t,choose.insert(*it),all.erase(it); while(choose.size()&&all.size()&&(it=--choose.end())->t>all.begin()->t) { cnt+=all.begin()->t;cnt-=(it=--choose.end())->t; all.insert(*it);choose.erase(it); choose.insert(*all.begin());all.erase(all.begin()); } } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { int v,x,y; scanf("%d%d%d",&v,&x,&y); int p=x+2*y; a[p][++num[p]].id=i; a[p][num[p]].t=v; } for(int i=0;i<4;i++) sort(a[i]+1,a[i]+1+num[i]); for(int i=0;i<4;i++) { for(int j=1;j<=num[i];j++) { sum[i][j]+=sum[i][j-1]+a[i][j].t; } } int start=0; while(start<=num[3]&&((num[1]+start<k)||(num[2]+start<k)||(m-start-2*(k-start)<0))) start++;//A B要取k 加起来得有m if(start==num[3]+1) { puts("-1"); return 0; } //预处理...xswl这tm才预处理... //枚举1 1 all是所有可选的 choose是已经选了的 long long ans=1e16,pos=-1; for(int i=0;i<3;i++) { for(int j=num[i];j>(i==0?0:k-start);j--) all.insert(a[i][j]); } for(int i=start;i<=num[3];i++) { range(i);upch(); long long res=sum[3][i]+cnt; if(i<=k) res+=sum[1][k-i]+sum[2][k-i]; if(res<ans&&((k-i>=0)?(i+2*(k-i)+choose.size()==m):(i+choose.size()==m))) { ans=res; pos=i; //cout<<ans<<' '<<pos<<endl; } } //cout<<pos<<endl; printf("%lld\n",ans); all.clear();choose.clear(); for(int i=0;i<3;i++) { for(int j=num[i];j>(i==0?0:k-start);j--) all.insert(a[i][j]); } for(int i=start;i<=num[3];i++) { range(i);upch(); if(i==pos) { for(int j=1;j<=i;j++) printf("%d ",a[3][j].id); for(int j=1;j<=k-i;j++) printf("%d %d ",a[1][j].id,a[2][j].id); for(auto it=choose.begin();it!=choose.end();it++) printf("%d ",it->id); puts(""); return 0; } } puts("-1"); return 0; }