[BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103
题目分析
THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的。嗯,有些东西就是明白得太晚。
首先Orz ZYF-ZYF 神犇的题解。
题目给出的 n 和 m 的范围差别很大,n 很小,m 很大,因此可以想到 n 的范围是为了直接暴力枚举。
题目要求的就是 A 的一段区间中的数和 B 的一段区间中的数的异或的第 k 大值。
位运算有关的题目,一般是从高位到低位贪心之类的。
区间异或,一般要使用可持久化 Trie。
我们对于范围大的 B 数组建立可持久化 Trie,这样就可以提取 B 数组的一个区间了。
从高位到低位,枚举 A 数组区间中的每个元素,根据 Trie 结点的信息,求出这一位为 0 和 为 1 的各有多少,并据此确定答案的这一位。
要注意的是,A 数组区间中每个元素要对应的 Trie 结点是不同的,由它们的前几位确定(因为它们的前几位不同,但是要求异或之后前几位相同)。
编辑完这篇博客之后还是一个一个地添加了标签,虽然这个blog马上就要停更了,感觉这几天写的任何一篇都有可能是最后一篇。
奇怪的感觉。
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 1000 + 5, MaxM = 300000 + 5, MaxNode = 10000000 + 5; int n, m, p, Index, Ans;
int A[MaxN], B[MaxM], Root[MaxM], Son[MaxNode][2], T[MaxNode], F[MaxN], Q[MaxN]; bool OK[MaxN]; void Build(int &x, int y, int Num, int Bit)
{
if (!x) x = ++Index;
if (Bit == 0)
{
T[x] = T[y] + 1;
return;
}
if (Num & (1 << (Bit - 1)))
{
Son[x][0] = Son[y][0];
Build(Son[x][1], Son[y][1], Num, Bit - 1);
}
else
{
Son[x][1] = Son[y][1];
Build(Son[x][0], Son[y][0], Num, Bit - 1);
}
T[x] = T[Son[x][0]] + T[Son[x][1]];
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
for (int i = 1; i <= m; ++i)
{
scanf("%d", &B[i]);
Build(Root[i], Root[i - 1], B[i], 31);
}
scanf("%d", &p);
int u, d, l, r, kk;
for (int i = 1; i <= p; ++i)
{
scanf("%d%d%d%d%d", &u, &d, &l, &r, &kk);
kk = (d - u + 1) * (r - l + 1) - kk + 1;
Ans = 0;
for (int j = u; j <= d; ++j)
{
F[j] = Root[r];
Q[j] = Root[l - 1];
}
for (int j = 30; j >= 0; --j)
{
int x, Temp = 0;
for (int k = u; k <= d; ++k)
{
x = (A[k] & (1 << j));
if (x) Temp += T[Son[F[k]][1]] - T[Son[Q[k]][1]];
else Temp += T[Son[F[k]][0]] - T[Son[Q[k]][0]];
}
if (Temp >= kk)
{
for (int k = u; k <= d; ++k)
{
x = (A[k] & (1 << j));
if (x)
{
F[k] = Son[F[k]][1];
Q[k] = Son[Q[k]][1];
}
else
{
F[k] = Son[F[k]][0];
Q[k] = Son[Q[k]][0];
}
}
}
else
{
kk -= Temp;
Ans |= (1 << j);
for (int k = u; k <= d; ++k)
{
x = (A[k] & (1 << j));
if (x)
{
F[k] = Son[F[k]][0];
Q[k] = Son[Q[k]][0];
}
else
{
F[k] = Son[F[k]][1];
Q[k] = Son[Q[k]][1];
}
}
}
}
printf("%d\n", Ans);
}
return 0;
}
[BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】的更多相关文章
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...
- 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化trie树
Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i ...
- 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 474 Solved: 258 De ...
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
我们观察数据:树套树 PASS 主席树 PASS 一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)
内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...
- bzoj4103: [Thu Summer Camp 2015]异或运算
对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
随机推荐
- ADS1.2 集成开发环境的使用
连风大神都没用过这个ADS1.2,什么破玩意儿啊,好像板子里面的资料也没有找到有这个软件,但是网上有滴,ADS1.2 集成开发环境的使用还是要会的,,, ARM ADS 全称为ARM Develope ...
- 【转载】TCL装载包和版本控制
转载来源:http://blog.chinaunix.net/uid-9967220-id-3033702.html package forget ?package package ...? ...
- 简单的ROT13码编码与解码
ROT13码意思是将字母左移13位.如'A' ↔ 'N', 'B' ↔ 'O','V' ↔ 'I'. 下面实现ROT13码的解码. function rot13(str) { var arr = [] ...
- jquery animate 制作简单弹幕
定位滚动条 $("html,body").animate({scrollTop:$(".middle1").offset().top},1000) 弹幕 < ...
- Spark与Hadoop计算模型的比较分析
http://tech.it168.com/a2012/0401/1333/000001333287.shtml 最近很多人都在讨论Spark这个貌似通用的分布式计算模型,国内很多机器学习相关工作者都 ...
- ie编程半天的学习总结
自己好久没有来这个博客了,自己陆续去几个地方写博客,一个c++博客园,一个csdn. 感觉都一般吧,看不到什么好的博客,可能自己没有看到吧.以后就在这个博客记录一点技术笔记吧!自己比较懒,只要做为记录 ...
- SQLserver中常用的函数及实例
聚合函数 as是可以起别名的,在select和from之间的是表示列名,可以不加单引号)(聚合函数中的count不仅能对数字进行操作还能对字符型进行操作,其余的只能对数字操作) 最小值 select ...
- ios专题 - 常用设计模式
设计模式:解决编程问题的设计模板 设计模式是一个抽象工具,用于面向对象的软件开发,以及其他领域.它是一个设计模板,在特定背景中,解决一般性的.重复出 现的问题.因此,设计模式是一种针对特定的.具体的设 ...
- 04_HttpClient发送Https请求
[实例 带Cookie访问HTTPS类型的 建信基金 的某一页面)] /** * 创建一个可以访问Https类型URL的工具类,返回一个CloseableHttpClient实例 */ public ...
- mysql innodb 数据打捞(一)innodb 页面结构特征
如果文件系统损坏或意外删除了数据库文件,只要磁盘空间没有被覆盖,其实数据都还在磁盘的扇区中,还是可以恢复出来的,有些通用的文件恢复工具好象也可以恢复文件 ,但这里要研究的是在通用文件 恢复工具失效的时 ...