关闭

bzoj4103【THUSC2015】异或运算

标签: bzoj可持久化Trie树
3112人阅读 评论(0) 收藏 举报
分类:

4103: [Thu Summer Camp 2015]异或运算

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 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

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




可持久化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 300005
using 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
查看评论

BZOJ 4103~4105 THUSC2015 题解

T1:BZOJ 4013 xor 题目大意:给定一个长度为nn的数列aa和一个长度为mm的数列bb,给定矩阵AA,令Ai,j=ai⊕bjA_{i,j}=a_i\oplus b_j,qq次询问某个子矩形里的kk大值 n≤1000,m≤3∗105,q≤500n\leq 1000,m\leq 3*10...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-06-03 17:55
  • 3433

bzoj4103【THUSC2015】异或运算

可持久化Trie树
  • AaronGZK
  • AaronGZK
  • 2016-06-01 00:27
  • 3112

BZOJ 4105: [Thu Summer Camp 2015]平方运算

这道题好劲啊 乍一看就知道是线段树 然而不知道怎么做 于是又看题解 愉快地引用结论 (数据里的p比较特殊???
  • cgh_Andy
  • cgh_Andy
  • 2017-04-23 15:22
  • 531

THUSC2015

这套题测得时候被暴虐了。。。 T1:  bzoj 4103: [Thu Summer Camp 2015]异或运算  http://www.lydsy.com/JudgeOnline/problem.php?id=4103  这题是个水题,就是以Y...
  • abc473848880_
  • abc473848880_
  • 2015-06-15 16:18
  • 974

【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算

【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
  • Maxwei_wzj
  • Maxwei_wzj
  • 2017-05-18 19:34
  • 188

【BZOJ4103】【Thusc2015】异或运算 可持久Trie

现在再来切是不是有点晚QAQ 题目大意是给定两个正整数序列。规定矩阵(异或运算),每个询问求某个子矩阵内第k大的值。其中。 注意到N和Q比较小,所以就是把序列B建成可持久Trie,然后同时跑A中的若干个数。。。 如果想不清楚可以先考虑当N=1,也就是A是一个数的情况,然后再考虑如何合并。 /...
  • qq_34637390
  • qq_34637390
  • 2016-06-01 11:08
  • 120

bzoj4103[Thu Summer Camp 2015]异或运算

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,分别表示两个数列...
  • RecLxf
  • RecLxf
  • 2015-12-05 14:41
  • 168

【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∈[u,d],j∈[l,r],找出第k大的Aij。 Input 第...
  • sunshinezff
  • sunshinezff
  • 2016-05-31 17:03
  • 287

强大的异或运算

什么是异或? Wikipedia的解释: 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 XOR 或 EOR 或 ⊕(编程语言中常用^)。但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。转化为...
  • su20145104009
  • su20145104009
  • 2016-05-02 08:35
  • 6623

bzoj4104【THUSC2015】解密运算

一道神奇的乱搞题
  • AaronGZK
  • AaronGZK
  • 2016-06-01 23:23
  • 2841
    个人资料
    • 访问:739242次
    • 积分:11554
    • 等级:
    • 排名:第1591名
    • 原创:417篇
    • 转载:3篇
    • 译文:0篇
    • 评论:45条
    云中谁寄锦书来