
线性基
lushanlushan0026
退役acmer,准研究生
展开
-
P4301 [CQOI2013] 新Nim游戏 线性基+贪心
由nim游戏可知先手想要获胜得在后手第一次取完后各石子数异或不为0 也就是说在先手第一次取完后得到的线性基 是异或不出0的(否则后手将剩余的取完 就可以异或出0 然后先手就进入必败态) 根据线性基的性质 我们可以把a数组从大到小排序 然后按顺序插入线性基 如果一个数无法插入线性基 那么就说明可以异或出0了 我们要把这个数取掉 为什么是从大到小呢 我们看 10 9 3 这三个数 他们异或为0 如果我们从大到小插入的话 最后先手取得的最小石子数就是3 这有点猜...原创 2020-07-13 08:41:59 · 145 阅读 · 0 评论 -
CodeForces - 587E 和 无力回天NOI2017 线性基套路+线段树
这两个题十分相似 就放在一起讲了 它们的操作1都相同 1 l r x 将区间l到r的数都异或x 这个操作似乎可以线段树区间修改 不过 2操作明显涉及到线性基 如果进行区间修改的话 线性基如何处理 在这要用到线性基的一个套路 当我们说两个线性基相同的时候 当且仅当它们可以异或出来的数相同 我们先对数组做一个异或差分 那么1操作就变成了l和r+1两处的单点修改 那2操作如何实现 我们观察一下 到这 r-l 个数 是不是可以将到...原创 2020-07-08 08:59:21 · 398 阅读 · 0 评论 -
P4570 [BJWC2011]元素 线性基上贪心
n个物品,有编号和价值两个属性,如果多个物品之间编号异或为0,那么他们就会消失。求一个子集,使得总价值最大。 根据线性基的性质 假设我有3个物品的编号异或为0,那么这三个物品无论以什么样的顺序插入线性基,最后一个一定是无法插入的,那么有个显而易见的贪心策略:把物品按价值降序排序,如果一个物品能插入线性基,我们就加上它的价值,否则忽略。 #include<bits/stdc++.h> using namespace std; const int N = 1e3+10; typedef l.原创 2020-06-18 10:15:50 · 166 阅读 · 0 评论 -
线性基模板 求n个数中任意数异或和的最大值
题目链接:线性基模板 #include<bits/stdc++.h> using namespace std; const int N = 66; typedef long long ll; ll a[N],d[N]; void add(ll x){ for(int i = 55; i >= 0; i--){ if((x>>i)&1){ if(!d[i]){ d[i]=x; break; } else x^=d[i]; .原创 2020-06-07 20:19:30 · 783 阅读 · 0 评论