一个比较麻烦的模拟...
#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;
}
京公网安备 11010502036488号