XOR Queries

时间限制: 1000ms   内存限制: 256M

描述

给出一个长度为n的数组C,回答m个形式为(L,R,A,B)的询问,含义为存在多少个不同的数组下标k∈[L,R]满足C[k]⨁A≥B(式中⨁为异或运算)。

输入

输入第一行为一个整数T,表示一共有T组测试数据。

对于每组测试数据:

第一行为两个整数n,m(1≤n,m≤50000)。

第二行为n个整数表示数组C(0≤C[i]≤109)。

接下来m行中,第i行有四个整数Li,Ri,Ai,Bi(1≤Li≤Ri≤n, 0≤Ai,Bi≤109)。

输出

对于每次询问:输出一个整数表示满足条件的数组下标数目。

样例输入1 复制

1
5 2
1 2 3 4 5
1 3 1 1
2 5 2 3
样例输出1

2
2
分析:区间问题很容易想到莫队;
   然后有了区间内所有数,怎么查x^a>=b;
   考虑异或,建01字典树插入删除查询即可;
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+;
int n,m,k,t,a[maxn],bel[maxn],tot,cnt,ans[maxn],ch[maxn*][],sz[maxn*],num;
long long ret;
struct node
{
int l,r,id,block,c,d;
bool operator<(const node&p)const
{
return block==p.block?r<p.r:block<p.block;
}
}qu[maxn];
void insert(int x)
{
int pos=;
for(int i=;i>=;i--)
{
int y=(x>>i&);
if(ch[pos][y]==)
{
ch[pos][y]=++num;
ch[num][]=ch[num][]=;
sz[ch[pos][y]]=;
}
sz[ch[pos][y]]++;
pos=ch[pos][y];
}
}
void del(int x)
{
int pos=;
for(int i=;i>=;i--)
{
int y=(x>>i&);
sz[ch[pos][y]]--;
pos=ch[pos][y];
}
}
int query(int x,int y)
{
int ret=,pos=;
for(int i=;i>=;i--)
{
int z=(x>>i&),w=(y>>i&);
if(w==)
{
pos=ch[pos][z^];
if(i==)ret+=sz[pos];
}
else ret+=sz[ch[pos][z^]],pos=ch[pos][z];
if(pos==)break;
}
return ret;
}
int main()
{
int i,j;
scanf("%d",&t);
while(t--)
{
cnt=;
num=;
sz[]=;
tot=;
ch[][]=ch[][]=;
scanf("%d%d",&n,&m);
int sz=(int)sqrt(n);
for(i=;i<=n;i++)
{
bel[i]=tot;
if(++cnt==sz)tot++,cnt=;
}
for(i=;i<=n;i++)scanf("%d",&a[i]);
for(i=;i<=m;i++)scanf("%d%d%d%d",&qu[i].l,&qu[i].r,&qu[i].c,&qu[i].d),qu[i].id=i,qu[i].block=bel[qu[i].l];
sort(qu+,qu+m+);
int l=,r=;
for(i=;i<=m;i++)
{
while(r < qu[i].r)
{
insert(a[++r]);
}
while(l > qu[i].l)
{
insert(a[--l]);
}
while(r > qu[i].r)
{
del(a[r--]);
}
while(l < qu[i].l)
{
del(a[l++]);
}
ans[qu[i].id]=query(qu[i].c,qu[i].d);
}
for(i=;i<=m;i++)printf("%d\n",ans[i]);
}
return ;
}

最新文章

  1. $.extend()的实现源码 --(源码学习1)
  2. CCPC2016杭州现场赛
  3. openldap加密传输sssd
  4. 版本python2和版本3.X的一个区别之一
  5. 用delphiXE7 dbExpress Framework提供的功能获取数据表信息
  6. UIView的生命周期
  7. 转载:简单介绍Python中的try和finally和with方法
  8. HDU5668 Circle 非互质中国剩余定理
  9. Linux怎样修改系统时间
  10. Oracle EBS-SQL (BOM-17):检查8层BOM.sql
  11. SPOJ:To the moon
  12. Itest(爱测试),最懂测试人的开源测试管理软件隆重发布
  13. 简单的shell脚本练习(一)
  14. 基于struts研究传值问题
  15. [转]对form:input标签中的数字进行格式化
  16. C# 用反射动态绑定事件
  17. iTunes Connect开发者指南中的一个疑问
  18. Codeforces 614E - Necklace
  19. JSBridge实现示例
  20. 20155302 2016-2017-2 《Java程序设计》第七周学习总结

热门文章

  1. 异常强大的Markdown编辑插件-Markdown Preview Enhanced
  2. JavaScript(JS)的简单使用
  3. SpringBoot SpringDataJPA 动态查询、多条件查询
  4. 34、JavaScript面向对象(内置构造函数&amp;相关方法|属性|运算符&amp;继承&amp;面向对象)
  5. JavaScript--确认(confirm 消息对话框)
  6. BZOJ 4668 LCT
  7. CSS怎样改变行内样式(通过外部级联样式表) css !important用法CSS样式使用优先级判断
  8. Android webview js 调用java方法报错&quot;Uncaught TypeError: Object [object Object] has no method xx
  9. ansible 显示运行时间
  10. Glide4.0 centerCrop属性和圆角 冲突