BZOJ2741 【FOTILE模拟赛】L
一个上午两道题,妥妥的作死。。。
首先还是按照之前思路建立可持久化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相关推荐
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】
题目 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj) ...
- 2017.10.14 【FOTILE模拟赛】L 失败总结
很有代表性的一道题,什么都想不出来 首先有一个套路:区间的问题可以通过前缀和化成两点的问题 然后就是在区间找任意一/两个点的异或值最大, 在trie树上按二进制位从大到小贪心找就可以了 多组询问,所以 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 模拟赛-20190114-新魔法(distance)
前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...
- 3.27模拟赛 sutoringu(后缀数组)
\(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...
最新文章
- 代码实践|通过简单代码来回顾卷积块的历史
- java手动提交事务_Mybatis是如何将事务和连接池高效的结合的
- Mvvm、第一个Vue程序、Vue基本语法
- 对不起,你以前学的 ElasticSearch 都是垃圾!
- 数据结构学习笔记(树、二叉树)
- 为什么你就是学不会 Numpy ? | 技术头条
- 弄了一个数学论坛,感觉不错,欢迎加入讨论
- python2.7 内置ConfigParser支持Unicode读写
- es elasticsearch-head安装
- iptv错误代码2003什么意思_IPTV部分错误代码及原因解释
- iQOO探索悦行者深入阿尔山林海体验性能和操控激情
- oracle12c口令文件,学习笔记:Oracle 12C ASM 新特性 共享密码文件
- Golang一日一库之 日志库 zap
- AutoCAD Civil 3D-创建道路模型(1 道路三要素)
- webgis开发学习线路
- JST 连接器 B4B-ZR-SM4-TFT SMD 4POS 1.5MM
- macOS 非 PC, 为何一定要绑定AD?
- aarch64安装mysql_Linux安装MySQL
- 监听Mac OS X的全局鼠标事件
- Codeforces Round #827 (Div. 4)(A~G)(F已更新)
热门文章
- MyEclipse极速优化
- 数据同步关于去除乱码插入mysql数据库
- 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
- LeetCode 12 Integer to Roman (整数转罗马数字)
- Yii ActiveRecord 的via和viaTable示例
- 电厂MIS,SIS简介
- 动态绑定与继承:不得不去想细节
- 算法----单链表反转
- vue 用户拖拽窗口大小_VUE实战1:鼠标拖放改变窗口大小,后台管理界面
- Hadoop架构-YARN