線性基解析及模板

2021-09-25 22:23:37 字數 1444 閱讀 3515

例題(查詢異或最大值)

#include#define ll long long

#define maxn 10005

using namespace std;

int t,n,q;

ll k,tmp;

struct l_b

}flag=1;//可異或得到0

return false;

} ll get_max()//求最大異或值

ll get_min()//求最小異或值

inline void rebuild()//重構 找第k小的前置步驟

ll kth(ll k)//找第k小

ll getindex(ll v)//看v是異或和第幾小

void merge(l_b &n2)//把線性基n2 內的元素 逐一插入到線性基n1 中

};int main()

int main()

else}}

return 0;

}

線性基的交:

例題

#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=5e4+5;

int n,m;

ll base[35];

struct l_b

inline bool insert(ll x)//向線性基中插入元素

}return false;

}}tree[maxn<<2];

l_b merge(l_b a,l_b b)

else}}

if(can)}}

c.l=a.l,c.r=b.r;

return c;

}void build(int i,int l,int r)

return ;

}int mid=(l+r)>>1;

build(i<<1,l,mid);

build(i<<1|1,mid+1,r);

tree[i]=merge(tree[i<<1],tree[i<<1|1]);

}bool query(int i,int l,int r,ll v)

int mid=(tree[i].l+tree[i].r)>>1;

if(r<=mid)

return query(i<<1,l,r,v);

else if(l>mid)

return query(i<<1|1,l,r,v);

else

return query(i<<1,l,mid,v)&query(i<<1|1,mid+1,r,v);

}inline void prework()

inline void mainwork()

}int main()

模板 線性基模板

數學太差,直接線性基當資料結構用orz 表示數集 1,2 k 1 表示乙個異或集合 可以說是將原數集壓縮 性質 直接抄的orz,雖然也不是特別懂 0 2.線性基的異或集合中每個元素的異或方案唯一,其實這個跟性質1是等價的。3.線性基二進位制最高位互不相同。1,2n 1 1,2n 1 1,2n 1 5...

模板 線性基

難度較大,請勿棄療 給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。n 50sample input33 21sample output 3看上去莫名其妙地想貪心。給些定義 s 為無符號整數集 即s n 記為 xor sum s x or s um s s1 s2 s s ...

模板 線性基

給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。線性基模板可解決 將n個整數看做集合a 線性基即為集合a的子集 線性基中每個元素的異或方案唯一,也就是說,線性基中不同的異或組合異或出的數都是不一樣的。線性基的二進位制最高位互不相同。這樣我們先構造出線性基 然後貪心的去搞最大...