「bzoj 4184: shallot」】的更多相关文章

权限题 线段树分治加线性基 首先这个题要求删除线性基肯定是没法处理的 于是我们套上一个线段树分治 线段树分治就是一种能够避免删除的神仙操作 我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是一个区间 我们求出来每个数的存在区间,每一个区间对应在线段树上并不会超过\(logn\)段 我们就把这些存活区间插入到线段树里去,标记永久化一下 由于一个线性基也就是\(logn\)的空间,所以我们直接一路把线性基搞下来,中间把标记插入线性基就好了 到叶子结点我们就可以处理询问了 代码 #inclu…
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #define BIT 30 #define gc() getchar() #define MAXIN 500000 //#define…
Description 在某时刻加入或删除一个点,问每个时刻的集合中能异或出来的最大值是多少. Sol 线段树+按时间分治+线性基. 按时间分治可以用 \(logn\) 的时间来换取不进行删除的操作. 把一个数字的存在时间挂在线段树的区间上,不超过 \(logn\) 个区间,所以总和不超过 \(nlogn\) 个节点信息. 然后从上往下走遍历整个线段树,每次到根节点统计一下答案,这里跟线性基有些不同,线性基转置矩阵就是普通的高斯消元,这时候维护线性基,每次插入一个数,更新的贡献,统计答案的时候从…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就能做到),时间是 nlog2n 的,不太可过. 查了查发现就是线性基.因为新增一些数的话,线性基只会变大,所以可以很方便地栈序撤销.不过这样时间是不是还是 nlog2n ? 现性基求最大值是看看异或上这个位上的数,答案能否变大.能的话就异或上. #include<cstdio> #include&…
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树.......但是我们并没有真正把它与一些数据结构结合在一起过,像线性基,凸包都是只支持加入,不支持删除的.我们需要找一种\(O(nlogn)\) 的方案让他们也支持删除. 本题就可以用线段树维护线性基,那它的原理是什么呢,它为什么能让线性基支持删除操作了呢?其实我们看到线段树是就可以知道,它其实是维护的…
题目 显然二分图没有奇环 于是考虑使用并查集维护一下看看是否存在奇环 我们可以考虑加权并查集,维护出\(x\)到\(fa_x\)的实际距离 由于我们只需要考虑奇偶性,于是我们处理出到根的路径异或一下就好了 之后是动态删边的问题,我们可以考虑线段树分治 于是我们需要在线段树分治的时候维护一个并查集,还需要支持撤回操作 我们只需要一个不路径压缩的启发式合并并查集就好了 代码 #include<cstdio> #include<vector> #define re register in…
题目 杜教筛板子了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<tr1/unordered_map> #define re register #define maxn 5000005 #define LL long long using namespace std::tr1; unordered_map<int,int>…
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大.这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗? 你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0. Input 第一行一个正整数n表示总时间:第二行n个整数a1,…
题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的区间 cover一下 先用vector存起来 最后每个时间点有的权值,就是线段树上 该叶子节点的所有祖先的权值 DFS一下动态维护一个只用插入的线性基就好了 注意 考虑如果手上有两个A权值,删除一个时怎么处理 开多一个num存数量,fir存权值最早出现位置 于是数据貌似并没有这种情况?... sol…
学到了线段树新姿势! 先离线读入,根据时间建一棵线段树,每个节点上开一个vector存这个区间内存在的数(使用map来记录每个数出现的一段时间),然后在线段树上dfs,到叶子节点就计算答案. 注意!!从父节点带下来的线性基数组一定要放在函数里传给子节点!全局变量就会多出好多东西!这个其实是常识吧然而我蠢... #include<iostream> #include<cstdio> #include<vector> #include<map> using na…