XOR Queries
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
5 2
1 2 3 4 5
1 3 1 1
2 5 2 3
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 ;
}
XOR Queries的更多相关文章
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...
- XOR Queries(莫队+trie)
题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...
- CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...
- 计蒜客15430 XOR Queries(Trie处理位运算问题)
题意: 给出一个长度为n的数组C,回答m个形式为(L, R, A, B)的询问, 含义为存在多少个不同的数组下标k属于[L, R]满足C[k] XOR A >= B(式中XOR为异或运算). T ...
- codechef Chef And Easy Xor Queries
做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...
- codeforces 872 D. Something with XOR Queries(思维)
题目链接:http://codeforces.com/contest/872/problem/D 题意:给你一个排列p和对应的位置b也就是说p[b[i]]=i,然后给你最多询问2*n次找出所有的p排列 ...
- ACM ICPC Kharagpur Regional 2017
ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- 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 ...
随机推荐
- jsp整合discuz
转自:http://blog.sina.com.cn/s/blog_49298ed001000a99.html 最近在实验室做项目用到的一个东西,拿来介绍一下. 需求:现有行业应用 ...
- luogu 3415 祭坛
题目大意: 在平面上,有 n 个水晶柱,每个水晶柱可以用一个点表示 如果 4 个水晶柱依次相连可以构成一个四边形,满足其两条对角线分别平行于 x 轴和 y 轴,并且对角线的交点位于四边形内部(不包括边 ...
- etcd磁盘清理步骤
etcd默认的空间配额限制为2G,超出空间配额限制就会影响服务,所以需要定期清理 以下是etcd磁盘清理的步骤: 1. 显示空间配额: ETCDCTL_API=3 etcdctl --endpoint ...
- Linux运维人员-服务器组成硬件基础
第1章 1.1关于运维人员 1.1.1 运维的职责 数据不能丢 网站7*24小时运行 保证用户体验(用户体验要好) 1.1.2 运维原则 简单.易用.高效 === 简单.粗暴 1.2 服务器 1.2 ...
- 过河 2005年NOIP全国联赛提高组(离散化+dp)
1105 过河 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在河上有一 ...
- Codeforces 825D 二分贪心
题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t ...
- MVC系列学习(六)-Razor语法
注:本次代码加了样式,样式如下 <style> div { border: 1px solid red; margin: 10px auto; ...
- synchronized关键字详解(二)
synchronized关键字的性质 1.可重入:同一线程的外层函数获得锁之后,内层函数可直接再次获得该锁,好处:避免死锁,提升封装性 证明可重入粒度:1.同一个方法是可重入的 2.可重入不要求是同一 ...
- java 任意时间转换日期类型
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); try { Date dd=sdf.parse("201 ...
- Hibernate 延迟加载剖析与代理模式应用
本文来源于:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments