求助昨晚 CF E 题
  • 板块学术版
  • 楼主Eason_cyx大愚若智
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/21 10:20
  • 上次更新2025/1/21 13:07:24
查看原帖
求助昨晚 CF E 题
741244
Eason_cyx大愚若智楼主2025/1/21 10:20

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;
}
2025/1/21 10:20
加载中...