BZOJ 2460: [BeiJing2011]元素 贪心,线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460

解法:从大到小排序,依次贪心的添加到当前集合就可以了,需要动态维护线性基。用拟阵证明,线性基性质,线性基中任意子集异或和不为0,所以从大到小加入就好。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct node{
    LL a, b;
    node(){}
    bool operator<(const node &rhs) const{
        return b>rhs.b;
    }
}a[1005];
int n;
LL bin[65];
LL p[65];
int main()
{
    bin[0] = 1;
    for(int i=1; i<=63; i++) bin[i] = bin[i-1]<<1;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%lld %lld", &a[i].a, &a[i].b);
    }
    LL ans = 0;
    sort(a+1, a+n+1);
    for(int i=1; i<=n; i++){
        for(int j=63; j>=0; j--){
            if(a[i].a&bin[j]){
                if(!p[j]){
                    p[j] = i;
                    break;
                }
                else{
                    a[i].a ^= a[p[j]].a;
                }
            }
        }
        if(a[i].a) ans += a[i].b;
    }
    printf("%lld\n", ans);
    return 0;
}
时间: 2024-10-13 11:46:59

BZOJ 2460: [BeiJing2011]元素 贪心,线性基的相关文章

bzoj 2460: [BeiJing2011]元素【线性基+贪心】

先按魔力值从大到小排序,然后从大到小插入线性基中,如果插入成功就加上这个魔力值 因为线性基里是没有异或和为0的集合的,所以正确性显然,然后最优性,考虑放进去一个原来没选的,这样为了可行性就要删掉一个,又因为是从大到小加进去的,所以删掉的这个魔力值一定是大于加进去的,所以不优,所以贪心构造的就是最优解 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int

[BeiJing2011]元素[贪心+线性基]

2460: [BeiJing2011]元素 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1245  Solved: 652[Submit][Status][Discuss] Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中

BZOJ 2460 元素(贪心+线性基)

显然线性基可以满足题目中给出的条件.关键是如何使得魔力最大. 贪心策略是按魔力排序,将编号依次加入线性基,一个数如果和之前的一些数异或和为0就跳过他. 因为如果要把这个数放进去,那就要把之前的某个数拿出来,而这样交换之后集合能异或出的数是不会变的,和却变小了. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector

bzoj 2460 [BeiJing2011]元素 (线性基)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2460 题意: 给你一堆矿石,矿石有a,b两种性质,取任意个矿石,满足取得的这些矿石a性质异或和不为0,且b性质和最大,求b性质和的最大值. 思路: 线性基模板题, 根据线性基的性质: 线性基的任意一个子集异或和不为0.我们可以根据这些矿石的b性质从大到小排序,依此将这些矿石的a性质插到线性基里,如果能够插入的话就选这个,不能插入的话就不选. 实现代码: #include<bits/stdc

BZOJ_2460_[BeiJing2011]元素_线性基

Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而 使用了很多矿石,却在炼制过程中发现魔法矿石全部消失了,从而无法炼制 出法杖,这个现象被称为“魔法抵消” .特别地,如果在炼制过程中使用超过 一块同一种矿石,那么一定会发生“魔法抵消”.   后来,随着人们认知水平的提高,这个现象得到了很好的解释.经过

BZOJ 2460 [BeiJing2011]元素

[题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <string> #include <algorithm> #include <vector

【题解】 bzoj2460: [BeiJing2011]元素 (线性基)

bzoj2460,戳我戳我 Solution: 线性基板子,没啥好说的,注意long long 就好了 Code: //It is coded by Ning_Mew on 5.29 #include<bits/stdc++.h> #define LL long long using namespace std; const int maxn=1007; int n; LL A[maxn]; struct Node{ LL num;int val; }s[maxn]; LL ans=0; bo

【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基

题目描述 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中发现魔法矿石全部消失了,从而无法炼制出法杖,这个现象被称为“魔法抵消” .特别地,如果在炼制过程中使用超过一块同一种矿石,那么一定会发生“魔法抵消”. 后来,随着人们认知水平的提高,这个现象得到了很好的解释.经过了大量的实验后,著名法师 D

BZOJ 3105 CQOI 2013 新Nim游戏 &amp;&amp; 2460 BeiJing 2011 元素 拟阵+线性基

题目大意(新nim游戏):定义一种新的nim游戏,每个人在一开始都有一次机会拿走任意堆的石子或者一个都不拿,问先手必胜时第一次最少取走多少. 思路:正常的nim游戏只要有一个子集的异或和=0那么先手就是必败的.注意到只要过了两个回合之后这个游戏就变成了正常的nim游戏,如果在我们第一次取的时候,如果剩余的所有堆中存在一个子集的异或和=0,那么后手就会让他拿走之后剩下的石子的异或和为0,我们就输了.于是我们就是要求取走最少的石子使得剩下的石子中不存在一个子集使得异或和为0. 判定子集中是否有异或和