4103: [Thu Summer Camp 2015]异或运算
来源:互联网 发布:p2p网络摄像机软件使用 编辑:程序博客网 时间:2024/05/22 14:07
4103: [Thu Summer Camp 2015]异或运算
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 566 Solved: 302
[Submit][Status][Discuss]
Description
给定长度为n的数列X={x1,x2,…,xn}和长度为m的数列Y={y1,y2,…,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij。
Input
第一行包含两个正整数n,m,分别表示两个数列的长度
第二行包含n个非负整数xi
第三行包含m个非负整数yj
第四行包含一个正整数p,表示询问次数
随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述。
Output
共p行,每行包含一个非负整数,表示此次询问的答案。
Sample Input
3 3
1 2 4
7 6 5
3
1 2 1 2 2
1 2 1 3 4
2 3 2 3 4
Sample Output
6
5
1
HINT
对于100%的数据,0<=Xi,Yj<2^31,
1<=u<=d<=n<=1000,
1<=l<=r<=m<=300000,
1<=k<=(d-u+1)*(r-l+1),
1<=p<=500
Source
鸣谢佚名上传
[Submit][Status][Discuss]
注意到
p,n 都很小
每次询问,考虑从高到低逐位确定
于是就得解决,每次给一个前缀,询问有这个前缀的数字的数量
对于数列Y ,把它建成一棵可持久化trie
每次需要确定前缀的时候,对于X 数列的每个数字,都单独拿出来考虑
就在trie 树上继续往下走一步然后做差就行了
复杂度O(pnlog(maxvalue))
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 32;const int maxn = 1005;const int maxm = 3E5 + 3;int n,m,q,cnt,mi[N],A[maxn],o1[maxn],o2[maxn],rt[maxm],siz[maxm*N],ch[maxm*N][2];inline int getint(){ char ch = getchar(); int ret = 0; while (ch < '0' || '9' < ch) ch = getchar(); while ('0' <= ch && ch <= '9') ret = ret * 10 + ch - '0',ch = getchar(); return ret;}inline void Solve(){ int l1,r1,l2,r2,k,Ans = 0; l1 = getint(); r1 = getint(); l2 = getint(); r2 = getint(); k = getint(); k = (r1 - l1 + 1) * (r2 - l2 + 1) - k + 1; for (int i = l1; i <= r1; i++) o1[i] = rt[l2 - 1],o2[i] = rt[r2]; for (int i = 30; i >= 0; i--) { int sum = 0; for (int j = l1; j <= r1; j++) { int tmp = (A[j] & mi[i]) ? 1 : 0; sum += siz[ch[o2[j]][tmp]] - siz[ch[o1[j]][tmp]]; } if (sum >= k) { for (int j = l1; j <= r1; j++) { int tmp = (A[j] & mi[i]) ? 1 : 0; o2[j] = ch[o2[j]][tmp]; o1[j] = ch[o1[j]][tmp]; } } else { Ans |= mi[i]; k -= sum; for (int j = l1; j <= r1; j++) { int tmp = (A[j] & mi[i]) ? 0 : 1; o2[j] = ch[o2[j]][tmp]; o1[j] = ch[o1[j]][tmp]; } } } printf("%d\n",Ans);}int main(){ #ifdef DMC freopen("DMC.txt","r",stdin); #endif n = getint(); m = getint(); mi[0] = 1; for (int i = 1; i < 31; i++) mi[i] = mi[i - 1] << 1; for (int i = 1; i <= n; i++) A[i] = getint(); for (int i = 1; i <= m; i++) { int o1 = rt[i - 1],o2 = rt[i] = ++cnt,x = getint(); for (int j = 30; j >= 0; j--) { int Nex = (x & mi[j]) ? 1 : 0; ch[o2][Nex^1] = ch[o1][Nex^1]; ch[o2][Nex] = ++cnt; o1 = ch[o1][Nex]; o2 = ch[o2][Nex]; siz[o2] = siz[o1] + 1; } } q = getint(); while (q--) Solve(); return 0;}
- 4103: [Thu Summer Camp 2015]异或运算
- bzoj 4103: [Thu Summer Camp 2015]异或运算
- BZOJ 4103: [Thu Summer Camp 2015]异或运算
- 4103: [Thu Summer Camp 2015]异或运算
- bzoj4103[Thu Summer Camp 2015]异或运算
- BZOJ 4103 [Thu Summer Camp 2015]异或运算 可持久化Trie
- 【BZOJ 4103】[Thu Summer Camp 2015]异或运算 可持久化trie树
- bzoj 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
- 【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】
- BZOJ4104 [Thu Summer Camp 2015]解密运算
- [BZOJ4105][Thu Summer Camp 2015]平方运算
- 4104: [Thu Summer Camp 2015]解密运算
- BZOJ 4104 [Thu Summer Camp 2015]解密运算
- 【bzoj4104】[Thu Summer Camp 2015]解密运算 乱搞
- bzoj 4104: [Thu Summer Camp 2015]解密运算
- BZOJ 4105: [Thu Summer Camp 2015]平方运算
- bzoj 4104: [Thu Summer Camp 2015]解密运算 乱搞
- BZOJ 4104: [Thu Summer Camp 2015]解密运算
- 难以相信Windows 10竟然每月有5亿活跃用户
- WebService(9)_Apache CXF_CXFFrame_发布框架
- 20170529-leetcode-582-Kill process
- JSON API免费接口
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- 4103: [Thu Summer Camp 2015]异或运算
- 女黑客登场:轻松破解APP,共享单车任我骑!
- G2.9 std_alloc源码剖析
- tensorflow学习(2)MNIST机器学习入门
- 编程第五十一、五十二天
- 求两个list的差集
- JVM调优:选择合适的GC collector (三)
- 20 在苹果电脑上运行C语言程序
- maven+spring+mybatis