RT,用优先队列维护对于每一个 ai,可以减去的最大值。
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
long long n,num[100010],b[11],m,k,ans;
priority_queue<pair<long long,long long>>q;
int main()
{
long long T;
scanf("%lld",&T);
while(T--)
{
ans=0;
scanf("%lld%lld%lld",&n,&m,&k);
for(long long i=1;i<=n;i++)
scanf("%lld",&num[i]),ans+=num[i];
while(!q.empty()) q.pop();
for(long long i=1;i<=m;i++)
scanf("%lld",&b[i]);
for(long long i=1;i<=n;i++)
{
auto tmp=make_pair(0ll,0ll);
for(long long j=1;j<=m;j++)
{
auto tmp2=make_pair(num[i]-(num[i]&b[j]),i);
if(tmp2.first>tmp.first) tmp=tmp2;
}
q.push(tmp);
}
for(long long i=1;i<=k;i++)
{
auto head=q.top();
q.pop();
ans-=head.first;
num[head.second]-=head.first;
auto tmp=make_pair(0ll,head.second);
for(long long j=1;j<=m;j++)
{
auto tmp2=make_pair(num[head.second]-(num[head.second]&b[j]),head.second);
if(tmp2.first>tmp.first) tmp=tmp2;
}
q.push(tmp);
}
printf("%lld\n",ans);
}
}