bzoj2460: [BeiJing2011]元素

怕不是学了个假的线性基。。。一直以为要高位到低位插入,结果那个是高斯消元的线性基。。。

那么直接排序权值就行了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;

struct node{LL num;int d;}a[1100];
bool cmp(node n1,node n2){return n1.d>n2.d;}
LL lt[110];int ans;
void insert(LL k)
{
    for(int i=62;i>=0;i--)
        if(a[k].num&(1LL<<i))
        {
            if(lt[i]==0)
            {
                lt[i]=a[k].num;
                ans+=a[k].d;
                return ;
            }
            else a[k].num^=lt[i];
        }
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld%d",&a[i].num,&a[i].d);
    sort(a+1,a+n+1,cmp);
    
    ans=0;
    for(int i=1;i<=n;i++)insert(i);
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2018-08-02 16:38  AKCqhzdy  阅读(110)  评论(0编辑  收藏  举报