一个上午两道题,妥妥的作死。。。

首先还是按照之前思路建立可持久化trie,然后发现了点问题。。。

trie只能支持对于给定v求出最大xor值,也就是说我们要枚举a[i] (i ∈ [l, r]),于是单次询问复杂度O(n * 30),爆表

于是想到了需要预处理,方法是分块,预处理复杂度O(n * (n / sz) * 30),单次询问复杂度O(sz * 30)(sz为块的大小)

到这里的时候。。。网上的题解君们就只剩下程序了。。。于是害得蒟蒻理解错惹%>_<%

于是看到了BLADEVIL的题解,简直一目了然(但是程序注释不删不敢恭维= =)

重点要注意的就两个地方:

(1)f[i][j]为从第i个块的第一个元素开始,到第j个数的区间中,任意找两个数的xor值最大

(2)在计算l和r的时候。。。会爆int

  1 /**************************************************************
  2     Problem: 2741
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:5768 ms
  7     Memory:11508 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <algorithm>
 13
 14 using namespace std;
 15 typedef long long ll;
 16 const int N = 12005;
 17 const int sqrt_N = 120;
 18
 19 struct trie_node {
 20     int son[2], cnt;
 21 } t[N * 35];
 22 int cnt_trie = 1;
 23
 24 int n, m, a[N];
 25 int root[N], sz, w[N];
 26 int f[sqrt_N][N];
 27
 28 inline int read() {
 29     int x = 0;
 30     char ch = getchar();
 31     while (ch < '0' || '9' < ch)
 32         ch = getchar();
 33     while ('0' <= ch && ch <= '9') {
 34         x = x * 10 + ch - '0';
 35         ch = getchar();
 36     }
 37     return x;
 38 }
 39
 40 int A[35];
 41 void insert(int &root, int v) {
 42     int R = root, now = ++cnt_trie, i;
 43     root = now;
 44     for (i = 0; i <= 30; ++i)
 45         A[i] = v & 1, v >>= 1;
 46     reverse(A, A + 31);
 47     for (i = 0; i <= 30; ++i) {
 48         t[now].son[0] = t[R].son[0], t[now].son[1] = t[R].son[1];
 49         R = t[R].son[A[i]], now = t[now].son[A[i]] = ++cnt_trie;
 50         t[now].cnt = t[R].cnt + 1;
 51     }
 52 }
 53
 54 int query(int x, int y, int v) {
 55     int i, res = 0;
 56     for (i = 0; i <= 30; ++i)
 57         A[i] = v & 1, v >>= 1;
 58     reverse(A, A + 31);
 59     for (i = 0; i <= 30; ++i) {
 60         if (t[t[y].son[!A[i]]].cnt - t[t[x].son[!A[i]]].cnt)
 61             x = t[x].son[!A[i]], y = t[y].son[!A[i]], res += (1 << 30 - i);
 62         else x = t[x].son[A[i]], y = t[y].son[A[i]];
 63     }
 64     return res;
 65 }
 66
 67 int Query(int l, int r) {
 68     int i, maxi, res = w[l] < w[r] ? f[w[l] + 1][r] : 0;
 69     for (i = min(w[l] * sz, r); i >= l; --i)
 70         res = max(res, query(root[l - 1], root[r], a[i]));
 71     return res;
 72 }
 73
 74 void Block() {
 75     int i, j, l;
 76     sz = (int) sqrt(n);
 77     for (i = 1; i <= n; ++i) {
 78         w[i] = (int) (i - 1) / sz + 1;
 79         for (j = 1; j <= w[i]; ++j) {
 80             l = (j - 1) * sz;
 81             f[j][i] = max(f[j][i - 1], query(root[l], root[i], a[i]));
 82         }
 83     }
 84 }
 85
 86 int main() {
 87     int i, x, y, l, r, last_ans = 0;
 88     n = read(), m = read();
 89     for (i = 1, a[0] = root[0] = 0; i <= n; ++i) {
 90         a[i] = a[i - 1] ^ read(), root[i] = root[i - 1];
 91         insert(root[i], a[i]);
 92     }
 93     Block();
 94     while (m--) {
 95         x = read(), y = read();
 96         l = min(((ll) x + last_ans) % n + 1, ((ll) y + last_ans) % n + 1);
 97         r = max(((ll) x + last_ans) % n + 1, ((ll) y + last_ans) % n + 1);
 98         printf("%d\n", last_ans = Query(l - 1, r));
 99     }
100     return 0;
101 }

View Code

转载于:https://www.cnblogs.com/rausen/p/4176332.html

BZOJ2741 【FOTILE模拟赛】L相关推荐

  1. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

    题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...

  2. BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】

    题目 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj) ...

  3. 2017.10.14 【FOTILE模拟赛】L 失败总结

    很有代表性的一道题,什么都想不出来 首先有一个套路:区间的问题可以通过前缀和化成两点的问题 然后就是在区间找任意一/两个点的异或值最大, 在trie树上按二进制位从大到小贪心找就可以了 多组询问,所以 ...

  4. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  5. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  6. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. 模拟赛-20190114-新魔法(distance)

    前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai​ 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...

  9. 3.27模拟赛 sutoringu(后缀数组)

    \(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...

最新文章

  1. 代码实践|通过简单代码来回顾卷积块的历史
  2. java手动提交事务_Mybatis是如何将事务和连接池高效的结合的
  3. Mvvm、第一个Vue程序、Vue基本语法
  4. 对不起,你以前学的 ElasticSearch 都是垃圾!
  5. 数据结构学习笔记(树、二叉树)
  6. 为什么你就是学不会 Numpy ? | 技术头条
  7. 弄了一个数学论坛,感觉不错,欢迎加入讨论
  8. python2.7 内置ConfigParser支持Unicode读写
  9. es elasticsearch-head安装
  10. iptv错误代码2003什么意思_IPTV部分错误代码及原因解释
  11. iQOO探索悦行者深入阿尔山林海体验性能和操控激情
  12. oracle12c口令文件,学习笔记:Oracle 12C ASM 新特性 共享密码文件
  13. Golang一日一库之 日志库 zap
  14. AutoCAD Civil 3D-创建道路模型(1 道路三要素)
  15. webgis开发学习线路
  16. JST 连接器 B4B-ZR-SM4-TFT SMD 4POS 1.5MM
  17. macOS 非 PC, 为何一定要绑定AD?
  18. aarch64安装mysql_Linux安装MySQL
  19. 监听Mac OS X的全局鼠标事件
  20. Codeforces Round #827 (Div. 4)(A~G)(F已更新)

热门文章

  1. MyEclipse极速优化
  2. 数据同步关于去除乱码插入mysql数据库
  3. 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
  4. LeetCode 12 Integer to Roman (整数转罗马数字)
  5. Yii ActiveRecord 的via和viaTable示例
  6. 电厂MIS,SIS简介
  7. 动态绑定与继承:不得不去想细节
  8. 算法----单链表反转
  9. vue 用户拖拽窗口大小_VUE实战1:鼠标拖放改变窗口大小,后台管理界面
  10. Hadoop架构-YARN