「线性基」[BJWC2011]元素
[BJWC2011]元素
原题链接:BJWC2011元素
题目大意
给你N组数,每组数由两个数组成,分别是x, y,现在要让你求在一部分x异或之后的得到的结果不为0的情况下,y的和的最大值
题目题解
线性基裸题,如果不会线性基建议在线性基 了解一下,我们只要先对y排序,然后一个一个的塞进线性基里面就可以了,然后每次如果当前数可以塞的话就答案++,如果不行就看下一个
代码如下
//#define fre yes
#include <cstdio>
#include <algorithm>
const int N = 1005;
long long d[N];
struct message {
long long num;
long long t;
} arr[N];
bool cmp(message x, message y) {
return x.t > y.t;
}
long long ans = 0;
inline void add(long long x, long long t) {
for (int i = 62; i >= 0; i--) {
if(x & (1ll << i)) {
if(d[i]) x ^= d[i];
else {
ans += t;
d[i] = x;
break;
}
}
}
}
int main() {
static int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", &arr[i].num, &arr[i].t);
} std::sort(arr + 1, arr + 1 + n, cmp);
for (int i = 1; i <= n; i++) {
add(arr[i].num, arr[i].t);
} printf("%lld\n", ans);
return 0;
}