照着第一篇题解打的。
#include<bits/stdc++.h>
using namespace std;
int n,p,s,ans,op[3010];
struct node{
int val,id;
node(int x=0,int y=0){
id=x;val=y;
}
bool operator<(const node &x)const{
return val>x.val;
}
bool operator>(const node &x)const{
return val<x.val;
}
}a[3010],b[3010];
priority_queue<node,vector<node>,greater<node> >q1,q2,q3;
bool cmp(node x,node y){
return x.id<y.id;
}
int main(){
cin>>n>>p>>s;
for(int i=1;i<=n;i++)cin>>a[i].val,a[i].id=i;
for(int i=1;i<=n;i++)cin>>b[i].val,b[i].id=i;
sort(a+1,a+n+1);
for(int i=1;i<=p;i++)op[a[i].id]=1,ans+=a[i].val;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
q1.push(node(a[i].val,i));
q2.push(node(b[i].val,i));
q3.push(node(b[i].val-a[i].val,i));
}
for(int hyh=1;hyh<=s;hyh++){
int now=-INT_MAX,pos1,pos2,opt;
while(!q2.empty()&&op[q2.top().id]!=0)q2.pop();
if(!q2.empty()){
if(q2.top().val>now){
now=q2.top().val;
pos1=q2.top().id;
opt=1;
}
}
while(!q3.empty()&&op[q3.top().id]!=1)q3.pop();
while(!q1.empty()&&op[q1.top().id]!=0)q1.pop();
if(!q1.empty()&&!q3.empty()){
int sum=q1.top().val+q3.top().val;
if(sum>now){
now=sum;
pos1=q3.top().id;
pos2=q1.top().id;
opt=2;
}
}
ans+=now;
if(opt==1){
q2.pop();
op[pos1]=2;
}
else{
q1.pop(),q3.pop();
op[pos1]=2,op[pos2]=1;
q3.push(node(b[pos2].val-a[pos2].val,pos2));
}
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
if(op[i]==1)cout<<i<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
if(op[i]==2)cout<<i<<" ";
return 0;
}