大意: 给定n元素序列, m个询问$(l,r)$, 求$[l,r]$中选出任意数异或后的最大值

线性基沙茶题, 直接线段树暴力维护两个log还是能过的

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <math.h>
  5. #include <set>
  6. #include <map>
  7. #include <queue>
  8. #include <string>
  9. #include <string.h>
  10. #define REP(i,a,n) for(int i=a;i<=n;++i)
  11. #define PER(i,a,n) for(int i=n;i>=a;--i)
  12. #define hr putchar(10)
  13. #define pb push_back
  14. #define lc (o<<1)
  15. #define rc (lc|1)
  16. #define mid ((l+r)>>1)
  17. #define ls lc,l,mid
  18. #define rs rc,mid+1,r
  19. #define x first
  20. #define y second
  21. #define io std::ios::sync_with_stdio(false)
  22. #define endl '\n'
  23. using namespace std;
  24. typedef long long ll;
  25. typedef pair<int,int> pii;
  26. const int P = 1e9+7, INF = 0x3f3f3f3f;
  27. ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
  28. ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
  29. ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
  30. //head
  31.  
  32. const int N = 5e5+10;
  33.  
  34. int n, q, ql, qr;
  35. int a[N];
  36.  
  37. struct _ {
  38. int a[22];
  39. void ins(int x) {
  40. REP(i,1,*a) x=min(x,a[i]^x);
  41. if (x) a[++*a]=x;
  42. }
  43. _ operator + (const _ &rhs) const {
  44. _ r;
  45. REP(i,0,*a) r.a[i]=a[i];
  46. REP(i,1,rhs.a[0]) r.ins(rhs.a[i]);
  47. return r;
  48. }
  49. } tr[N<<2];
  50.  
  51. void build(int o, int l, int r) {
  52. if (l==r) return ({
  53. int t;
  54. scanf("%d", &t);
  55. tr[o].ins(t);
  56. });
  57. build(ls),build(rs);
  58. tr[o]=tr[lc]+tr[rc];
  59. }
  60. _ query(int o, int l, int r) {
  61. if (ql<=l&&r<=qr) return tr[o];
  62. if (mid>=qr) return query(ls);
  63. if (mid<ql) return query(rs);
  64. return query(ls)+query(rs);
  65. }
  66.  
  67. int main() {
  68. scanf("%d", &n);
  69. build(1,1,n);
  70. scanf("%d", &q);
  71. REP(i,1,q) {
  72. scanf("%d%d",&ql,&qr);
  73. auto t = query(1,1,n);
  74. int ans = 0;
  75. REP(i,1,t.a[0]) ans=max(ans,ans^t.a[i]);
  76. printf("%d\n", ans);
  77. }
  78. }

考虑一下一个log的做法, 对于每个基维护一个最后出现的位置, 贪心尽量让高位的位置最大就好了

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <math.h>
  5. #include <set>
  6. #include <map>
  7. #include <queue>
  8. #include <string>
  9. #include <string.h>
  10. #define REP(i,a,n) for(int i=a;i<=n;++i)
  11. #define PER(i,a,n) for(int i=n;i>=a;--i)
  12. #define hr putchar(10)
  13. #define pb push_back
  14. #define lc (o<<1)
  15. #define rc (lc|1)
  16. #define mid ((l+r)>>1)
  17. #define ls lc,l,mid
  18. #define rs rc,mid+1,r
  19. #define x first
  20. #define y second
  21. #define io std::ios::sync_with_stdio(false)
  22. #define endl '\n'
  23. using namespace std;
  24. typedef long long ll;
  25. typedef pair<int,int> pii;
  26. const int P = 1e9+7, INF = 0x3f3f3f3f;
  27. ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
  28. ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
  29. ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
  30. //head
  31.  
  32. const int N = 1e5+10;
  33. int n, q;
  34. int a[N][21], p[N][21];
  35.  
  36. int main() {
  37. scanf("%d", &n);
  38. REP(i,1,n) {
  39. int t;
  40. scanf("%d", &t);
  41. REP(j,0,20) a[i][j]=a[i-1][j],p[i][j]=p[i-1][j];
  42. int pos = i;
  43. PER(j,0,20) if (t>>j&1) {
  44. if (p[i][j]<pos) swap(a[i][j],t),swap(p[i][j],pos);
  45. if (!t) break;
  46. t ^= a[i][j];
  47. }
  48. }
  49. scanf("%d", &q);
  50. REP(i,1,q) {
  51. int l, r;
  52. scanf("%d%d", &l, &r);
  53. int ans = 0;
  54. PER(j,0,20) if (p[r][j]>=l) ans=max(ans,a[r][j]^ans);
  55. printf("%d\n", ans);
  56. }
  57. }

Ivan and Burgers CodeForces - 1100F (线性基)的更多相关文章

  1. Codeforces 1100F(线性基+贪心)

    题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...

  2. Codeforces1100F. Ivan and Burgers(离线+线性基)

    题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...

  3. Codeforces 1101G(线性基)

    题目链接 题意 将序列尽可能分成多段使得任意$x \geq 1$段内的所有元素的异或和大于$0$问最多多少段 思路 首先,如果所有元素异或和等于$0$答案显然为$-1$,否则构造整个序列的线性基,这个 ...

  4. Codeforces 1100 F - Ivan and Burgers

    F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...

  5. CodeForces - 1100F:Ivan and Burgers (线性基&贪心)(离线 在线)

    题意:给定N个数,Q次询问,求区间最大异或和. 思路:一开始想的线性基+线段树.单次线性基合并的复杂度为20*20,结合线段树,复杂度为O(NlogN*20*20):显然,超时. 超时代码: #inc ...

  6. codeforces 1100F Ivan and Burgers 线性基 离线

    题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基 ...

  7. CodeForces 1100F Ivan and Burgers

    CodeForces题面 Time limit 3000 ms Memory limit 262144 kB Source Codeforces Round #532 (Div. 2) Tags da ...

  8. Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)

    F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...

  9. F. Ivan and Burgers(线性基,离线)

    题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r], ...

随机推荐

  1. python堆排序

    堆是完全二叉树 子树是不相交的 度 节点拥有子树的个数 满二叉树: 每个节点上都有子节点(除了叶子节点) 完全二叉树: 叶子结点在倒数第一层和第二层,最下层的叶子结点集中在树的左部 ,在右边的话,左子 ...

  2. Js基础知识6-JavaScript匿名函数和闭包

    匿名函数 1,把匿名函数赋值给变量 var test = function() { return 'guoyu'; }; alert(test);//test是个函数 alert(test()); 2 ...

  3. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  4. 通过Java 线程堆栈进行性能瓶颈分析

    改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...

  5. laravel 对接支付宝

    使用的库 omnipay-alipay 申请支付宝支付 这个就不说了, 不明白如何下手的伙伴让运营去和支付宝客服联系吧 composer 安装git库 将以下代码添加到 composer.json { ...

  6. C++ 细小知识点

    1. C++ 拷贝构造函数参数为const类型 原因:因为复制构造函数是用引用方式传递复制对象,引用方式传递的是地址,因此在构造函数内对该引用的修改会影响源对象,防止源对象被修改,就要把参数类型设为c ...

  7. MAC BOOK Air 安装metasploit-framework

    Step 1:Xcode命令行开发工具OS X确保它已经安装了Xcode开发工具,在终端执行: xcode-select --install1Step 2:Java SDK安装Java sdk,不能用 ...

  8. P3938 斐波那契

    思路 脑子还真的是好东西,自己太笨了 容易发现父亲节点和儿子节点的关系 儿子节点大于父亲节点 儿子节点和父亲节点之差为斐波那契数,且斐波那契数为小于儿子节点的最大的一个 1e12中有60左右的斐波那契 ...

  9. POJ 2425 A Chess Game(有向图SG函数)题解

    题意:给一个有向图,然后个m颗石头放在图上的几个点上,每次只能移动一步,如果不能移动者败 思路:dfs打表sg函数,然后求异或和 代码: #include<queue> #include& ...

  10. 【Maven】2.使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库

    参考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html --------------------------------------------- ...