博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019 Multi-University Training Contest 1 - Operation
阅读量:4952 次
发布时间:2019-06-11

本文共 3017 字,大约阅读时间需要 10 分钟。

魔改线性基

强制在线的做法,需要维护一个前缀的线性基,每次新加入数的时候,要把靠右边的数提到线性基的高位

这样维护的线性基,在查询区间异或和的时候,只需要把r为前缀的线性基出现为止大于l且异或之后和更大的数异或起来就行了,新套路!!

#include 
#define INF 0x3f3f3f3f#define full(a, b) memset(a, b, sizeof a)#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)using namespace std;typedef long long LL;inline int lowbit(int x){ return x & (-x); }inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret;}inline int lcm(int a, int b){ return a / __gcd(a, b) * b; }template
inline A fpow(A x, B p, C lyd){ A ans = 1; for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd; return ans;}const int N = 1000005;int _, n, m, pos[N][32], l, r;LL b[N][32], val;int main(){ for(scanf("%d", &_); _; _ --){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++){ scanf("%lld", &val); for(int j = 0; j <= 31; j ++) b[i][j] = b[i - 1][j], pos[i][j] = pos[i - 1][j]; int cur = i; for(int j = 31; j >= 0; j --){ if(val & (1LL << j)){ if(!b[i][j]){ b[i][j] = val, pos[i][j] = cur; break; } else{ if(pos[i][j] < cur) swap(pos[i][j], cur), swap(b[i][j], val); val ^= b[i][j]; } } } } LL opt, l, r, cnt = n; LL val, ret = 0; while(m --){ scanf("%lld", &opt); if(opt == 0){ scanf("%lld%lld", &l, &r); l = (l ^ ret) % cnt + 1, r = (r ^ ret) % cnt + 1; if(l > r) swap(l, r); ret = 0; for(int i = 31; i >= 0; i --){ if(pos[r][i] >= l && (ret ^ b[r][i]) > ret) ret ^= b[r][i]; } printf("%lld\n", ret); } else{ scanf("%lld", &val); val ^= ret, cnt ++; for(int i = 0; i <= 31; i ++) b[cnt][i] = b[cnt - 1][i], pos[cnt][i] = pos[cnt - 1][i]; int cur = cnt; for(int i = 31; i >= 0; i --){ if(val & (1LL << i)){ if(!b[cnt][i]){ b[cnt][i] = val, pos[cnt][i] = cur; break; } else{ if(pos[cnt][i] < cur) swap(pos[cnt][i], cur), swap(b[cnt][i], val); val ^= b[cnt][i]; } } } } } for (int i=1;i<=n;++i) for (int j=30;j>=0;--j) b[i][j] = pos[i][j] =0; } return 0;}

转载于:https://www.cnblogs.com/onionQAQ/p/11233709.html

你可能感兴趣的文章
SpringMVC从入门到精通之第三章
查看>>
JS基础-dom操作
查看>>
【转】Android详细的对话框AlertDialog.Builder使用方法
查看>>
Unite Beijing 2015大型活动
查看>>
loading加载的代码
查看>>
PHP框架CI CodeIgniter 的log_message开启日志记录方法
查看>>
arraylist
查看>>
关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
371. Sum of Two Integers java solutions
查看>>
2124: 等差子序列 - BZOJ
查看>>
3529: [Sdoi2014]数表 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
在程序被送入后台时,向 iOS 借点时间,来完成一个长期任务
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
前端之路
查看>>
javascript 继承
查看>>
String类型转int类型方法
查看>>