【贪心】【线性基】bzoj2460 [BeiJing2011]元素

题意:让你求一些数在XOR下的带权极大无关组。

带权极大无关组可以用贪心,将这些数按权值从大到小排序之后,依次检验其与之前的数是否全都线性无关。可以用线性基来搞。

可以用拟阵严格证明,不过也可以脑补一下……

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll d[64],p[64];
int cnt;//简化线性基的大小
bool Insert(ll val){//尝试插入线性基,返回是否插入成功
	for(int i=62;i>=0;--i){
		if(val&(1ll<<i)){
			if(!d[i]){
				d[i]=val;
				break;
			}
			val^=d[i];
		}
	}
	return val>0;
}
ll QueryMax(){
	ll res=0;
	for(int i=62;i>=0;--i){
		if((res^d[i])>res){
			res^=d[i];
		}
    }
	return res;
}
ll QueryMin(){
	for(int i=0;i<=62;++i){
		if(d[i]){
			return d[i];
		}
	}
	return 0;
}
void Rebuild(){//化为简化线性基
	for(int i=62;i>=0;--i){
		for(int j=i-1;j>=0;--j){
			if(d[i]&(1ll<<j)){
				d[i]^=d[j];
			}
		}
	}
	for(int i=0;i<=60;++i){
		if(d[i]){
			p[cnt++]=d[i];
		}
	}
}
ll Kth(ll K){
	ll res=0;
	if(K>=(1ll<<cnt)){
		return -1ll;
	}
	for(int i=60;i>=0;--i){
		if(K&(1ll<<i)){
			res^=p[i];
		}
	}
	return res;
}
int n;
struct Point{
	ll x,y;
	Point(const ll &x,const ll &y){
		this->x=x;
		this->y=y;
	}
	Point(){}
};
Point a[1005];
bool cmp(const Point &a,const Point &b){
	return a.y>b.y;
}
int main(){
//	freopen("bzoj2460.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%lld%lld",&a[i].x,&a[i].y);
	}
	sort(a+1,a+n+1,cmp);
	ll ans=0;
	for(int i=1;i<=n;++i){
		if(Insert(a[i].x)){
			ans+=a[i].y;
		}
	}
	printf("%lld\n",ans);
	return 0;
}
时间: 2024-10-10 15:36:18

【贪心】【线性基】bzoj2460 [BeiJing2011]元素的相关文章

[bzoj2460] [BeiJing2011]元素(线性基+贪心)

题目大意: 有一些矿石,每个矿石有一个a和一个b值,要求选出一些矿石,b的和最大且不存在某个矿石子集它们的a的异或和为0. 解题关键:对魔力进行由大到小排序,依次加入线性基,统计即可. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace st

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

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

【题解】 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

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

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

[BZOJ2460][BeiJing2011]元素

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

【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基

[BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(又轮到

bzoj3105 [cqoi2013]新Nim游戏——贪心+线性基

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3105 首先,要先手必胜,就不能取后让剩下的火柴中存在异或和为0的子集,否则对方可以取成异或和为0的状态,那么必败: 可以贪心地从大到小排序,如果一堆火柴可以被之前的一些火柴堆(基)异或表出,那么这堆火柴必须拿走: 证明好像是拟阵什么的,不会... 代码如下: #include<iostream> #include<cstdio> #include<cstring>

bzoj 4004 [JLOI2015]装备购买——拟阵证明贪心+线性基

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4004 看Zinn博客水过去-- 运用拟阵可以证明按价格从小到大买的贪心是正确的.但自己还不会. 然后如果当前物品可以被线性表出就不买了.否则买,在第一个不能线性表出的位置上记录这个物品,表示按已经被消成这样的这个物品的这一位来消掉这一位是可以和前面那些位的消的情况吻合的. 然后因为卡精度而用long double.在printf里是Lf. #include<iostream> #incl

线性基(一

1.线性基: 若干数的线性基是一组数a1,a2,...ana1,a2,...an,其中axax的最高位的11在第xx位. 通过线性基中元素xorxor出的数的值域与原来的数xorxor出数的值域相同. 2.线性基的构造法: 对每一个数pp从高位到低位扫,扫到第xx位为11时,若axax不存在,则ax=pax=p并结束此数的扫描,否则令p=pp=p   xorxor ax.ax. 3.查询: 用线性基求这组数xorxor出的最大值:从高往低扫axax,若异或上axax使答案变大,则异或. 4.判断