【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】

原创 2016年05月31日 17:03:46

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

题解:

           注意到p,u,d都很小,所以可以对第二维建可持久化trie,然后枚举第一维.

           查询的时候在可持久化trie上跑一遍即可.

           注意查询的时候对需要每个数记录一下当前它在trie树上的位置.

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 300010 
using namespace std;
int bin[35],ch[N*32][2],sum[N*32],root[N],n,m,l,r,k,u,d,num,cnt,Q,a[N],b[N];
struct use{int x,y,v;}q[N];
int insert(int x,int v){
  int t,y;t=y=++cnt;
  for (int i=30;i>=0;i--){
  	int t=v&bin[i];t>>=i;
  	ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];
	y=ch[y][t]=++cnt;
	x=ch[x][t];sum[y]=sum[x]+1; 
  }
  return t;
}
int query(int k){
  int ans(0);
  for (int i=30;i>=0;i--){
  	int size(0);
    for (int j=1;j<=num;j++){
       int t=(q[j].v)&bin[i];t>>=i;
       size+=sum[ch[q[j].y][t^1]]-sum[ch[q[j].x][t^1]];
    }
    if (size>=k){
	   ans+=bin[i];
	   for (int j=1;j<=num;j++){
	     int t=(q[j].v)&bin[i];t>>=i;
	     q[j].x=ch[q[j].x][t^1];q[j].y=ch[q[j].y][t^1];
	   }
	}
	else{
	   k-=size;
	   for (int j=1;j<=num;j++){
	     int t=(q[j].v)&bin[i];t>>=i;
	     q[j].x=ch[q[j].x][t];q[j].y=ch[q[j].y][t];
	   }
	}
  }
  return ans;
}
int main(){
  scanf("%d%d",&n,&m);
  bin[0]=1;for (int i=1;i<=30;i++) bin[i]=bin[i-1]*2;
  for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  for (int i=1;i<=m;i++) scanf("%d",&b[i]),root[i]=insert(root[i-1],b[i]);
  scanf("%d",&Q);
  for (int i=1;i<=Q;i++){
    scanf("%d%d%d%d%d",&u,&d,&l,&r,&k);num=0;
    for (int j=u;j<=d;j++) q[++num]=use{root[l-1],root[r],a[j]};
    printf("%d\n",query(k));
  }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

summer框架做增删改查-总结

1、datatable的显示 function initTable(){ $('#wzcbkList').dataTable().fnDestroy(); $('#wzcbkList'...
  • u011513323
  • u011513323
  • 2014年09月15日 14:58
  • 1445

【POJ 3352】 Road Construction(边联通分量入门)

【POJ 3352】 Road Construction(边联通分量入门) Road Construction Time Limit: 2000MS   Memory Limit: 65...
  • ChallengerRumble
  • ChallengerRumble
  • 2016年02月20日 21:22
  • 569

Pixhawk之学习杂谈

一、开篇         具体上一篇博文已经很久了,最近主要就是参加了几家公司的电话面试,思考了一些问题,本身就是半路杀进无人机领域的门外汉。对整个飞行控制部分理解的也是皮毛的皮毛,经过几家面试之后,...
  • qq_21842557
  • qq_21842557
  • 2016年05月09日 15:51
  • 10986

Boot Camp 支持软件与系统要求对照表——用于手工下载Window 支持软件(驱动)

教你如何手工知道苹果电脑上合适的 Window 支持软件(驱动)版本 MacBook:如何查找序列号 http://support.apple.com/kb/HT1366?view...
  • meron
  • meron
  • 2013年08月01日 14:17
  • 1852

UI(二) 基础视图

基础视图 本讲内容: (UILabel UITextField UIButton UIAlertView delegate) UILabel(标签):是显示文本的控件。在App中UILabel是...
  • MHTios
  • MHTios
  • 2014年08月18日 23:10
  • 594

java.util.concurrent包下的几个常用类

本文的参考地址:http://blog.csdn.net/xsl1990/article/details/18564097 1.Callable Callable与Runnable类似,理解Cal...
  • Summer_YuXia
  • Summer_YuXia
  • 2017年07月12日 10:14
  • 528

hdu1827Summer Holiday【tarjan强连通分量解决最小联系费用】

1A~·~~~撒花!这比买买买开心多了^-^ 思路:既然是强连通分量的题,很容易想到形成的东西是一坨一坨的,哈哈,然后如果某一坨入度为0,那么很不幸,这一坨只能直接被威士忌通知,至于具体通知这一坨中...
  • zhou_yujia
  • zhou_yujia
  • 2015年11月11日 08:35
  • 482

【分享】泽越止系列游戏ら~じPonPon+SummerRadishVacation!【日文硬盘版】[

泽越止是谁? 诚哥他老爸 人称真正的人渣,万恶的根源 近亲相○达人  有着一个剪不断理还乱的肮脏族谱,貌似有对女性有一定诱惑力的血统, 简单的说吧,泽越止的子...
  • wangzi867258173
  • wangzi867258173
  • 2016年08月25日 21:14
  • 6211

2015-2017机器人操作系统(ROS)及其应用暑期学校资料汇总 ROS Summer School 持续更新

综合信息:2015     2016 课程资料:2015     2016 全部课程视频链接:智能机器人运动与视觉实验室...
  • ZhangRelay
  • ZhangRelay
  • 2016年07月27日 09:08
  • 3863

第五部分 架构篇 第十四章 MongoDB Replica Sets 架构(自动故障转移/读写分离实践)

MongoDB Replica Set架构部署实践,自动故障转移和读写分离实践过程。
  • u014548782
  • u014548782
  • 2015年01月16日 11:43
  • 1121
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】
举报原因:
原因补充:

(最多只允许输入30个字)