zoukankan      html  css  js  c++  java
  • BJWC2011 元素

    题目链接:戳我

    如何保证选出来一些数,他们任意一个子集的异或和不为0?
    显然可以用线性基维护一下。
    那么如何求选出来的数的元素值最大呢?我们排序一下子就好啦!将元素按照从大到小排序。至于原因,和上一道题一样。

    不过请注意,这个题的id值在long long范围内,线性基中的左移操作记得开1ll

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #define MAXN 100010
    using namespace std;
    int n;
    int a[MAXN];
    long long tot;
    long long p[MAXN];
    struct Node{long long id;int sum;}node[MAXN];
    inline bool cmp(struct Node x,struct Node y){return x.sum>y.sum;}
    inline void insert(long long x)
    {
        for(int i=63;i>=0;i--)
        {
            if(x&(1ll<<i))
            {
                if(!p[i]){p[i]=x;break;}
                x^=p[i];
            }
        }
    }
    inline long long query(long long x)
    {
        for(int i=63;i>=0;i--)
        {
            if(x&(1ll<<i))
            {
                if(p[i]) x^=p[i];
            }
        }
        return x;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
            scanf("%lld%d",&node[i].id,&node[i].sum),tot+=node[i].sum;
        sort(&node[1],&node[n+1],cmp);
        long long cur_ans=0;
        for(int i=1;i<=n;i++) 
        {
            if(query(node[i].id)==0) cur_ans+=node[i].sum;
            else insert(node[i].id);
        }
        // printf("%lld
    ",cur_ans);
        printf("%lld
    ",tot-cur_ans);
        return 0;
    }
    
  • 相关阅读:
    Using F2 to Rename Open Files
    Java 浅析 Thread.join()
    JDK 8
    Automata
    The Hungarian Abhorrence Principle
    Spring 与 MyBatis 的整合
    JDK 8
    面向对象设计原则汇总
    Java Error : type parameters of <T>T cannot be determined during Maven Install
    【源码拾遗】从vue-router看前端路由的两种实现
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10868283.html
Copyright © 2011-2022 走看看