bzoj4103【THUSC2015】异或运算
来源:互联网 发布:java lambda 性能 编辑:程序博客网 时间:2024/05/21 09:53
4103: [Thu Summer Camp 2015]异或运算
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 359 Solved: 188
[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
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
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
鸣谢佚名上传
可持久化Trie树
发现n和m的范围差距很大,所以n可以暴力枚举,m用可持久化Trie树提取区间。
题目要求a数组一段区间的数和b数组一段区间的数异或的k大值,考虑从高位到低位贪心,每次尽量选1,否则选0。
于是从高到低枚举每一位,询问a数组每一个元素对应那棵Trie树上节点大小,进而判断这一位能否填1。
注意:a数组每一个数对应的Trie树要分别保存。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define F(i,j,n) for(int i=j;i<=n;i++)#define D(i,j,n) for(int i=j;i>=n;i--)#define ll long long#define N 1005#define M 300005using namespace std;int n,m,q,cnt,x_1,x_2,y_1,y_2,k;int a[N],b[M];int sz[M*35],c[M*35][2],rt[M];struct data{int x,y;}p[N];inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}void insert(int x,int &y,int val,int tmp){y=++cnt;sz[y]=sz[x]+1;c[y][0]=c[x][0];c[y][1]=c[x][1];if (tmp==-1) return;int t=(val>>tmp)&1;insert(c[x][t],c[y][t],val,tmp-1);}int solve(int k,int tmp){if (tmp==-1) return 0;int sum=0;F(i,x_1,x_2){int t=(a[i]>>tmp)&1;sum+=sz[c[p[i].y][t^1]]-sz[c[p[i].x][t^1]];}if (sum>=k){F(i,x_1,x_2){int t=(a[i]>>tmp)&1;p[i].x=c[p[i].x][t^1];p[i].y=c[p[i].y][t^1];}return solve(k,tmp-1)+(1<<tmp);}else{F(i,x_1,x_2){int t=(a[i]>>tmp)&1;p[i].x=c[p[i].x][t];p[i].y=c[p[i].y][t];}return solve(k-sum,tmp-1);}}int main(){n=read();m=read();F(i,1,n) a[i]=read();F(i,1,m) b[i]=read();F(i,1,m) insert(rt[i-1],rt[i],b[i],30);q=read();while (q--){x_1=read();x_2=read();y_1=read();y_2=read();k=read();F(i,x_1,x_2) p[i].x=rt[y_1-1],p[i].y=rt[y_2];printf("%d\n",solve(k,30));}}
0 0
- bzoj4103【THUSC2015】异或运算
- 【BZOJ4103】【Thusc2015】异或运算 可持久Trie
- 【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
- bzoj4103[Thu Summer Camp 2015]异或运算
- 【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】
- 【BZOJ4104】【Thusc2015】解密运算
- bzoj4104【THUSC2015】解密运算
- THUSC2015
- BZOJ4105: [ThuSC2015]平方运算(并查集+线段树)
- 异或运算
- 异或运算符
- 异或运算
- C#异或运算
- 异或运算
- 异或运算
- 异或运算
- 异或运算应用
- smartoj2470异或运算
- UVa 725 Division
- 从整数1到99之间选出能被3整除、且有一位上的数是5的那些数,并把它们放在p数组中,输出(p数组中)满足条件的数据。
- Javascript学习1-基础知识
- Mac下MySql卸载方法
- PyQt5:表格布局(15)
- bzoj4103【THUSC2015】异或运算
- 从键盘上输入一个数,将其插入到数列{2,5,6,8,12,13,15,17,19,22}中,并保证该数列的有序性。
- 简单的LINUX字符设备驱动及编译进Linux内核
- 解决hp开机"511-cpu fan not detected "错误
- php反转字符串的三种方法
- xUtils 简介
- 二叉树——Java初步实现
- PyQt5:事件与信号(16)
- 从键盘上输入一个3行3列矩阵的各个元素的值,然后输出2条主对角线元素之和。