题目链接:

XOR Queries

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

输入描述

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

对于每组测试数据:

第一行为两个整数nn,mm(1 \leq n, m \leq 500001≤n,m≤50000)。

第二行为nn个整数表示数组CC(0 \leq C[i] \leq 10^{9}0≤C[i]≤10​9​​)。

接下来mm行中,第ii行有四个整数L_{i}L​i​​,R_{i}R​i​​,A_{i}A​i​​,B_{i}B​i​​(1 \leq L_{i} \leq R_{i} \leq n1≤L​i​​≤R​i​​≤n, 0 \leq A_{i}, B_{i} \leq 10^{9}0≤A​i​​,B​i​​≤10​9​​)。

输出描述

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

样例输入

1
5 2
1 2 3 4 5
1 3 1 1
2 5 2 3

样例输出

2
2 题意:给出一个数列,然后m个询问,每一询问是问这个区间里面有多少个a[k]^A>=B;
思路:显然是一个莫队,trie树里面存的是当前区间里面的数,所以需要trie的insert和del操作,
然后就是询问这个区间里面有多少个异或大于等于B就贪心就好了,注意最后相等的情况,需要写个query就好;
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
int n,m,a[maxn],ans[maxn];
struct node
{
int l,r,a,b,id,sq;
}po[maxn];
int cmp(node x,node y)
{
if(x.sq==y.sq)return x.r<y.r;
return x.l<y.l;
}
int ch[31*maxn][2],val[31*maxn];
int sz;
inline void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
inline void insert(int x)
{
int u=0,len=30;
for(int i=len;i>=0;i--)
{
int c=((x>>i)&1);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
val[u]++;
}
}
inline void Delete(int x)
{
int u=0,len=30;
for(int i=len;i>=0;i--)
{
int c=((x>>i)&1);
u=ch[u][c];
val[u]--;
}
}
inline int query(int A,int B)
{
int u=0,len=30,sum=0,flag;
for(int i=len;i>=0;i--)
{
int c=((A>>i)&1),d=((B>>i)&1);
int ha=u;
if(ch[u][1]&&(c^1)>d)
{
int tep=ch[u][1];
sum=sum+val[tep];
}
if(ch[u][0]&&(c^0)>d)
{
int tep=ch[u][0];
sum=sum+val[tep];
}
flag=0;
if(ch[u][1]&&(c^1)==d)u=ch[u][1],flag=1;
if(ch[u][0]&&(c^0)==d)u=ch[u][0],flag=1;
if(ha==u)break;
}
if(flag)sum=sum+val[u];
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
int sq=sqrt(n*1.0);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&po[i].l,&po[i].r,&po[i].a,&po[i].b);
po[i].id=i;po[i].sq=po[i].l/sq;
}
sort(po+1,po+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(r<po[i].r)r++,insert(a[r]);
while(r>po[i].r)Delete(a[r]),r--;
while(l<po[i].l)Delete(a[l]),l++;
while(l>po[i].l)l--,insert(a[l]);
ans[po[i].id]=query(po[i].a,po[i].b);
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}
return 0;
}

  

 

XOR Queries(莫队+trie)的更多相关文章

  1. XOR (莫队)

    Time Limit: 2000 ms   Memory Limit: 256 MB Description 给定一个含有n个整数的序列 a1, a2,..., an. 定义 f(x,x) = a[x ...

  2. Sona && Little Elephant and Array && Little Elephant and Array && D-query && Powerful array && Fast Queries (莫队)

    vjudge上莫队专题 真的是要吐槽自己(自己的莫队手残写了2个bug) s=sqrt(n) 是元素的个数而不是询问的个数(之所以是sqrt(n)使得左端点每个块左端点的范围嘴都是sqrt(n)) 在 ...

  3. CodeForces 375D Tree and Queries 莫队||DFS序

    Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...

  4. 7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树

    LINK:qiqi20021026的T1 考场上只拿到了50分的\(nq\)暴力. 考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高. 先考虑LCS的问题 常见解决方法是后缀数组/tri ...

  5. CFGym101138D Strange Queries 莫队/分块

    正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...

  6. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  7. [Codeforces375D]Tree and Queries(莫队算法)

    题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...

  8. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  9. Codeforeces 617E XOR and Favorite Number(莫队+小技巧)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

随机推荐

  1. 探讨"点"语法的奥秘

    点语法 一直以来,都不理解什么是点语法,都说是相当于链接或是路径.也许我浏览的信息量少吧,看过好几篇有关的博文,没什么记载,本篇只是初步见解分析. 在javascript里,属性和方法都使用“点”语法 ...

  2. center os7.2 apache+php+mysql环境配置并设置https访问

    本人阿里云购买的center os7.2系统,小程序只支持https,因此需要配置https 安装apache yum -y install httpd systemctl start httpd a ...

  3. C#生成PDF2019

    因接口生成Pdf推送, 工作需要进行Pdf生成,但网上生成Pdf的文档好少: 1.生成Pdf需要文件路径/内容  都可以配置 2.使用组件 itextsharp.dll 本人用版本:v2.0.5072 ...

  4. 什么是浮动IP

    源地址:https://www.1and1.com/digitalguide/server/know-how/what-is-a-floating-ip/ What is a floating IP? ...

  5. linux centos7安装phpMyAdmin详解,以及解决各种bug问题

    使用php和mysql开发网站的话,phpmyadmin和navicat是目前非常好的mysql管理工具,但是phpmyadmin最主要是免费开源,目前很多集成的开发环境都会自带phpmyadmin, ...

  6. Elasticsearch之分词器的作用

    前提 什么是倒排索引? Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分.对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言,要用不同的 ...

  7. Spring boot 解决 hibernate no session异常

    启动类中加入 @Beanpublic OpenEntityManagerInViewFilter openEntityManagerInViewFilter(){ return new OpenEnt ...

  8. quickSort - 编程细节

    quicksort 快速排序 有几个细节比较重要 今天听到一个清华的大佬的话,他曾经是NOI, 在大一就得到了我梦寐以求的ACM金奖,他这样说, 他们在打NOI的时候,每天要求做10道题, 连续做60 ...

  9. bugfree登录后报错PHP Fatal error: Call-time pass-by-reference has been removed in

    详细报错信息[Tue Apr 25 06:49:07.556316 2017] [:error] [pid 21799] [client *.*.*.*:55813] PHP Fatal error: ...

  10. JAVA初学者(一)

    2015-12-15 21:26:17 刚学的java  做个总结: 1.构造函数没有返回值. 2.A对象调用Q的方法,Q方法里的变量就是A的变量 Fraction add(Fraction f) 在 ...