「线性基」[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;
}
posted @ 2019-10-15 19:08  Nicoppa  阅读(143)  评论(0编辑  收藏  举报