4103: [Thu Summer Camp 2015]异或运算
2017-05-29 21:32
148 查看
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))
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; }
相关文章推荐
- 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
- bzoj4103[Thu Summer Camp 2015]异或运算
- bzoj 4103: [Thu Summer Camp 2015]异或运算
- 【BZOJ4103】[Thu Summer Camp 2015]异或运算 可持久化Trie树
- BZOJ 4103 [Thu Summer Camp 2015]异或运算 可持久化Trie
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
- BZOJ 4103: [Thu Summer Camp 2015]异或运算
- 【BZOJ 4103】[Thu Summer Camp 2015]异或运算 可持久化trie树
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
- [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树
- bzoj 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
- 【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】
- 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化Trie树
- 4103: [Thu Summer Camp 2015]异或运算
- BZOJ4104 [Thu Summer Camp 2015]解密运算
- BZOJ 4105: [Thu Summer Camp 2015]平方运算
- bzoj:4105: [Thu Summer Camp 2015]平方运算
- BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
- 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
- bzoj4105: [Thu Summer Camp 2015]平方运算 线段树处理一类循环问题