解析:
显然,访问频率高的数字要放在前面,所以对于数字的频率进行由大到小排序。
假设两个序列当前包含的数字个数为cnt1、cnt2,所以当前遍历的这个数字的搜索时间为
(cnt1+1)*s1和(cnt2+1)*s2,比较一下两个世界谁更短则放入哪个即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,s1,s2;
struct node{
int id,cnt;
bool operator<(const node& t)const{
return cnt>t.cnt;
}
}a[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&s1,&s2);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].cnt);
a[i].id=i;
}
sort(a+1,a+n+1);
vector<int>res1,res2;
for(int i=1;i<=n;i++){
if(res1.size()*s1+s1>res2.size()*s2+s2){
res2.push_back(a[i].id);
}
else{
res1.push_back(a[i].id);
}
}
cout<<res1.size();
for(int i=0;i<res1.size();i++){
printf(" %d",res1[i]);
}
cout<<endl<<res2.size();
for(int i=0;i<res2.size();i++){
printf("% d",res2[i]);
}
cout<<endl;
}
return 0;
}