洛谷P4570 [BJWC2011]元素 题解报告

题目地址

题意:

如原题所述。

分析:

原理:当一个元素插入线性基失败时,表示可以由之前的元素异或得到。

思路

贪心思想。先将魔力值从大到小排序,再逐个插入线性基,若可插入,则计入结果。

我一开始在正确的思路上陷入了复杂的方向,想将元素按原顺序插入线性基,当遇到插入失败的元素时,再找到组成这个元素的之前的其他数字中,魔力值最小的那个,将其标记以去除,再重新插入一遍线性基,以为\(O(n^2loga_i)\)能过得去。而实际上,按魔力值排序后,后面的元素即使插不进去,在组成这个元素的之前的数字中,当前元素的魔力值也必然是最小的,所有可以采取贪心。

代码:

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

ll base[64];

struct dat {
	ll a,b;
	bool operator < (const dat& p) const {return b>p.b;}
} ar[1005];


int main()
{
	cin.tie(0)->sync_with_stdio(false);
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>ar[i].a>>ar[i].b;
	}
	sort(ar+1,ar+n+1);
	ll ans=0;
	for(int j=1;j<=n;++j)
	{
		ll x=ar[j].a;
		for(int i=63;i>=0;--i)
		{
			if(x>>i)
			{
				if(base[i])
					x^=base[i];
				else{
					base[i]=x;
					ans+=ar[j].b;
					break;
				}
			}
		}
	}
	cout<<ans;
}
posted @ 2023-01-03 11:49  ice_dragon_grass  阅读(28)  评论(0)    收藏  举报