BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #define BIT 30 #define gc() getchar() #define MAXIN 500000 //#define…
相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中发现魔法矿石全部消失了,从而无法炼制出法杖,这个现象被称为“魔法抵消” .特别地,如果在炼制过程中使用超过一块同一种矿石,那么一定会发生“魔法抵消”.   后来,随着人们认知水平的提高,这个现象得到了很好的解释.经过了大量的实验后,著名法师 Dmit…
[题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题目.↓ 首先构建dfs树. 发现图不联通的时候,当且仅当删去了树边和所有覆盖它的非树边. 所以对于每一条非树边随机一个权值,然后每条树边为所有覆盖它的非树边的权值的异或. 每次判断是否线性无关即可. 神题! [代码] #include <cstdio> #include <cstring&g…
题目链接 题意 中文题意 思路 线性基学习 题目要求选价值最大的并且这些数异或后不为0,可以考虑线性基的性质:线性基的任意一个非空集合XOR之和不会为0.那么就可以贪心地对价值从大到小排序,加入线性基的数就加上它的价值,最终线性基里面的元素的价值就是最终答案. #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int INF =…
传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以用一个类似树上差分的东西来实现.询问的时候把所有询问的边权加到线性基里,看是否某个数字能被线性表出. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #includ…
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即可(保留最多的不为0的堆) [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map&g…
CF388D. Fox and Perfect Sets 题意:求最大元素\(le n\)的线性空间的个数 给神题跪了 orz 容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不同的线性基个数 每一位我们插入一个向量,就获得了这一位的控制权,否则这一位是自由的 因为要\(le n\),可以使用数位DP 从高位到低位考虑,设当前第i位,已经插入了j个向量 没有天际线的限制 插入向量i的话,之前的向量位i必须是0,1种情况 不插入向量i的话,之前的向量位i可以任选,\(2^j\…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就能做到),时间是 nlog2n 的,不太可过. 查了查发现就是线性基.因为新增一些数的话,线性基只会变大,所以可以很方便地栈序撤销.不过这样时间是不是还是 nlog2n ? 现性基求最大值是看看异或上这个位上的数,答案能否变大.能的话就异或上. #include<cstdio> #include&…
题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为0的子集吗. so先手要使得他取完后不存在异或和为0的子集.从大到小依次尝试插入线性基即可. //820kb 0ms #include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar(…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460 解法:从大到小排序,依次贪心的添加到当前集合就可以了,需要动态维护线性基.用拟阵证明,线性基性质,线性基中任意子集异或和不为0,所以从大到小加入就好. #include <bits/stdc++.h> using namespace std; typedef long long LL; struct node{ LL a, b; node(){} bool operator<…