zoukankan      html  css  js  c++  java
  • 线性基学习笔记

    用法&&概述

    线性基是一种数据结构,可以用来维护序列的异或相关(比如去重,求极值)
    似乎还可以求异或后的第k小值,但我不会

    对于值域,转成二进制之后的每一位 i 对应一个数 a[i],然后维护这个数。
    a[i] 它的二进制最高位就是第i位

    具体维护方式是:
    对于每次插入一个新的值 x
    进行如下操作:
    1· 若此时x的二进制最高位 k ,a[k] 的值为零,将a[k]=x,退出
    2· 否则 x^=a[k] , 此时x的第k位就为0了,然后继续 1操作,或者x==0退出

    代码

    插入

    int add(ll x)
    {
        for(re int i=62; i>=0;i--)
        if(x&(1LL<<i))
        {
            if(!a[i]) {a[i]=x;return 1;}
            else x^=a[x];
        }
        return 0;
    }
    

    求MAX

    int getmax()
    {
        ll ans=0;
        for(re int i=52;i>=0;i--)
            ans=max(ans,ans^a[i]);
    }
    

    查询最小值: 就是线性基中的最小值
    可通过线性基可异或出的值个数: (2^{线性基元素个数}-1)

  • 相关阅读:
    1755:菲波那契数列
    1788:Pell数列
    3089:爬楼梯
    7832:最接近的分数
    7649:我家的门牌号
    7216:Minecraft
    7213:垃圾炸弹
    2983:谁是你的潜在朋友
    2723:因子问题
    2722:和数
  • 原文地址:https://www.cnblogs.com/yzhx/p/13161972.html
Copyright © 2011-2022 走看看