D. Marcin and Training Camp
题目要求满足 不存在 一个人,比所有人都强。我们将弱者向强者连有向边。如果当前有n个人,则不存在有一个人的入度为n-1。贪心删边即可。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
struct nod {
ll a, b;
}e[7010];
vector<int> vec[7010];
int sum[7010];
int main() {
int n; cin >> n;
ll ans = 0;
for (int i = 1; i <= n; i++) cin >> e[i].a;
for (int i = 1; i <= n; i++) cin >> e[i].b, ans += e[i].b;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (e[i].a ^ (e[i].a&e[j].a))vec[j].push_back(i),sum[i]++;
if (e[j].a ^ (e[i].a&e[j].a))vec[i].push_back(j),sum[j]++;
}
}
/*
for (int i = 1; i <= n; i++){
for (int j = 0; j < vec[i].size(); j++) {
cout << vec[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i <= n; i++)cout << sum[i] << " "; cout << endl;
*/
int now = n;
for (int k = 1; k <= n; k++) {
if (now == 1) {
ans = 0;
break;
}
int flg = 1;
for (int i = 1; i <= n; i++) {
if (sum[i] == now - 1) {
ans -= e[i].b;
sum[i] = 0;
now--;
flg = 0;
for (int j = 0; j < vec[i].size(); j++) {
sum[vec[i][j]]--;
}
break;
}
}
if (flg)break;
}
cout << ans << endl;
}