rt,为啥这样做不对啊。求 Hack。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[100005], b[15], c[100005][15];
bool flag[15];
struct node {
int i, j, sum;
bool operator > (const node& y) const {
return sum > y.sum;
} bool operator < (const node& y) const {
return sum < y.sum;
}
}; priority_queue<node> pq;
signed main() {
int t; cin >> t; while(t--) {
int n, m, k; cin >> n >> m >> k;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= m;i++) cin >> b[i];
for(int i = 1;i <= n;i++) {
memset(flag, 0, sizeof flag); int now = a[i];
for(int j = 1;j <= m;j++) {
int minn = 0x7fffffff, mini = 0; for(int k = 1;k <= m;k++) {
if(flag[k]) continue; if((now & b[k]) < minn) {
minn = now & b[k]; mini = k;
}
} flag[mini] = true; c[i][j] = now - minn; now = minn;
}
} while(!pq.empty()) pq.pop();
for(int i = 1;i <= n;i++) pq.push({i, 1, c[i][1]});
int sum = 0; for(int i = 1;i <= n;i++) sum += a[i];
for(int i = 1;i <= k;i++) {
node u = pq.top(); pq.pop(); sum -= u.sum;
if(u.j != m) pq.push({u.i, u.j+1, c[u.i][u.j+1]});
} cout << sum << endl;
}
return 0;
}