hdu 6579 Operation (在线线性基)】的更多相关文章

题意: 强制在线,求\(LR\)区间最大子集异或和 思路: 求线性基的时候,记录一个\(pos[i]\)表示某个\(d[i]\)是在某个位置更新进入的.如果插入时\(d[i]\)的\(pos[i]\)小于我当前插入的\(pos[r]\),那么就用当前插入的数换出原来的\(d[i]\),继续进行插入并更新\(pos\),这样就能保证所有的异或和都没有丢失.这样我们只要每次保存出所有\(dn[r][maxn]\)表示最右边为\(r\)时的线性基就可以直接求出所有区间\([L,R]\),\(1 <=…
传送门 •题意 一个数组a有n个数 m个操作 操作① 询问$[l,r]$区间的异或值 操作② 在数组末尾追加一个数x,数组长度变为$n+1$ 其中$l,r$不直接给出,其中$l=l%n+1,r=r%n+1$ 其中$x=x^lastans$($lastens$为上一次询问的答案) •思路 强制在线的线性基, 在线线性基就是在离线的基础上多开一维 具体思路跟CF1100F的在线做法一样,戳这里 记得处理一下$l,r,x$ •代码 #include<bits/stdc++.h> using name…
题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一组基线性基,然后按\(k\)的二进制找地k小.因为线性基不保存0,所以对有0的情况要进行特判. 代码: #include<map> #include<set> #include<cmath> #include<cstdio> #include<stack&…
题目链接 传送门 题意 初始时有\(n\)个数,现在有\(q\)次操作: 查询\([l,r]\)内选择一些数使得异或和最大: 在末尾加入一个数. 题目强制在线. 思路 对于\(i\)我们记录\([1,i]\)每个基底最靠近\(i\)的位置和这个位置的值,然后查询时看\(r\)这个位置记录的每个基底的位置是否大于等于\(l\),如果大于等于那么\([l,r]\)内一定有一个位置可以贡献这个基底,然后比较答案大小即可. 本题和\(cf1100F\)一样的写法只是多了个操作而已. 代码实现如下 #in…
题意:给定一个数列a,给定两种操作: 1.询问[l,r]区间内最大的xor和 2.n++,a[n]赋值为x 要求强制在线 n,m<=5e5,a[i]<2^30 思路:同CF1100F 固定右端点,维护每一维上使生成空间变大的最大的左端点 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题目大意是两个操作,1个是求[l,r]区间子序列的最大异或和,另一个是在最后面添加一个数. 如果题目简化成求[1,,i]的最大异或和,那么该怎么想呢.... 当然是处理出来一个前缀线性基啦.那么如何求一个区间呢.... 那就处理前缀线性基的时候记录线性基上该位置是在原序列的哪个位置,求值的时候在第r个线性基上找,如果位置>=l则是合法的. 可是这样想有点怪怪的. 如果有两个相同的数在同一位那不…
http://acm.hdu.edu.cn/showproblem.php?pid=6579 线性基https://blog.csdn.net/a_forever_dream/article/details/83654397 模板https://blog.csdn.net/u013534123/article/details/79875825 我们考虑在每个位置求出首位置到当前位置的线性基.同时我们要使线性基中高位的位置所选的数尽量靠后.这样我们维护线性基的时候在同时维护一个位置信息就好了. #…
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题目中可以出现异或和为0的情况,但线性基里是不会出现异或和为0的情况,所以我们需要多处理下,将数字全插入到线性基中,如果无法插入也就代表会出现异或和为0的情况,那么求第k小就应该变成求线性基中第k-1小. 实现代码: #include<bits/stdc++.h> using namespace s…
题意:给定N个数,Q次询问,求区间最大异或和. 思路:一开始想的线性基+线段树.单次线性基合并的复杂度为20*20,结合线段树,复杂度为O(NlogN*20*20):显然,超时. 超时代码: #include<bits/stdc++.h> #define pb push_back #define rep(i,a,b) for(int i=a;i<=b;i++) #define rep2(i,a,b) for(int i=a;i>=b;i--) using namespace std…
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不同的地方是要缩一下位使得k的每一位都有线性基(毕竟是组合为基础的). 要在往里塞线性基的时候把每个线性基上的1能往后放的尽量往后放emmm这么搞非常重要,以后写线性基都加一下这个可以处理的东西更多了. (这个东西维护之后,线性基中所有数都变为二进制的话那么每个二进制位上至多有一个1) 这道题不能取空…