洛谷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;
}

浙公网安备 33010602011771号