洛谷P4570 [BJWC2011]元素 线性基

时间:2023-03-09 14:39:19
洛谷P4570 [BJWC2011]元素 线性基

正解:线性基+贪心

解题报告:

传送门!

这题其实没什么好写题解的,,,显然贪心一下尽量选魔力大的,不用证明趴挺显然的来着

所以就直接按魔力排个序,插入线性基里面,能插就加个贡献,over

放下代码趴QwQ

(我好像,真的,写得越来越敷衍了TT

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define gc getchar()
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ll i=x;i<=y;++i)
#define my(i,x,y) for(ll i=x;i>=y;--i) const ll M=+,N=+;
ll n,poww[M]={},as;
struct stone{ll num,magic;}ston[N];
struct matrix
{
ll nod[M];
il bool insert(ll x){my(i,M-,)if(x&poww[i]){if(!nod[i])return nod[i]=x,;x^=nod[i];}return ;}
// il ll mx(){ll ret=0;my(i,M-10,0)ret=max(ret,ret^nod[i]);return ret;}
}gg; il ll read()
{
rc ch=gc;ll x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(stone gd,stone gs){return gd.magic>gs.magic;} int main()
{
// freopen("4570.in","r",stdin);freopen("4570.out","w",stdout);
rp(i,,M-)poww[i]=poww[i-]<<;
n=read();rp(i,,n)ston[i]=(stone){read(),read()};sort(ston+,ston++n,cmp);
rp(i,,n)if(gg.insert(ston[i].num))as+=ston[i].magic;printf("%lld\n",as);
return ;
}