传送门

突然发现自己没整理过异或的知识,正好借这个题整理一下。

关于异或

(1)异或就是在二进制下,两数各个位置上的数,相同为0,不同为1,所得到的数,比如说47,4的二进制是100,7的二进制是111,异或之后所得到的二进制数就是011=3,所以47=3。

(2)异或满足结合律与交换律,即ab=ba,(ab)c=a(bc)

(3)归零律:a^a=0

(4)a^0=a

(5)自反性:abb=a这个根据性质(3)(4)再加上结合律或者交换律很容易得出

解题思路

求区间异或和,可以先求出每个点的前缀异或和s[i],那么从l到r的区间异或和就是s[r]^s[l-1] (原因根据以上性质很容易推出)。

然后可以先想暴力算法。对于每次询问l到r,可以用i枚举右端点,从l到r。用j枚举左端点,从l-1到i-1。用s[i]^s[j]如果满足条件就将ans++,单次询问复杂度达到了n方。

有了暴力做法,剩下的就是优化嘛。如果每次都去枚举这个区间的每个异或值,不如去用一个数组b记录下某个值,在这个区间出现的次数。然后每加入一个点所造成的影响就是,将k(最终要求得到的疑惑和)^s[i] (当前点的前缀异或和)在区间中出现的次数(也就是b[ka[i]])加到ans中去(可以这么做的原因是,我们要在前面区间中找到一个值x,使得s[i]x=k,也就是k^s[i]=x)。那要怎么维护这个b数组呢???莫队,\(N*\sqrt[2]{n}\)的复杂度似乎可过。那么问题就简单了,只要考虑莫队中怎么加入和删除就可以了。根据前面的推理,很容易得出加入一个元素s[i] (这里的s[i]还是表示前缀异或和),就是将ans+b[k^s[i]],然后将b[s[i]]++。

AC代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+100;
int b[N],a[N];
int n,m,k,block[N];
struct node
{
int l,r,ans,pos;
}q[N];
bool cmp(node x,node y)
{
if(block[x.l]!=block[y.l])
return block[x.l]<block[y.l];
return x.r<y.r;
}
int ans=0;
void ins(int x)
{
ans+=b[k^a[x]];
b[a[x]]++;
}
void del(int x)
{
ans-=b[k^a[x]];
b[a[x]]--;
}
bool cmp2(node x,node y)
{
return x.pos<y.pos;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int kk=sqrt(n);
for(int i=1;i<=n;++i)
{
block[i]=(i-1)/kk+1;
scanf("%d",&a[i]);
a[i]^=a[i-1];
}
for(int i=1;i<=m;++i)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].l--;
q[i].pos=i;
}
sort(q+1,q+m+1,cmp);
int ri=0,le=0;
b[0]=1;
for(int i=1;i<=m;++i)
{
int l=q[i].l,r=q[i].r;
while(le>l)
ins(--le);
while(ri<r)
ins(++ri);
while(ri>r)
del(ri--);
while(le<l)
del(le++);
q[i].ans=ans;
}
sort(q+1,q+m+1,cmp2);
for(int i=1;i<=m;++i)
printf("%d\n",q[i].ans);
return 0;
}

[luogu4462][异或序列]的更多相关文章

  1. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  2. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  3. P3917 异或序列

    P3917 异或序列暴力前缀异或枚举每一个区间,再求和,60分.正解:按每一位来做对于区间[l,r],如果它对答案有贡献,区间中1的个数一定是奇数,可以按每一位取(1<<i)的前缀和,q[ ...

  4. bzoj 5301 [Cqoi2018]异或序列 莫队

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 155[Submit][Status ...

  5. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  6. Loj 2534 异或序列

    Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...

  7. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  8. [bzoj5301][Cqoi2018]异或序列_莫队

    异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...

  9. BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队

    Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...

随机推荐

  1. 重建索引解决mssql表查询超时的问题

    表已有数据,150万+,执行一个group by 的查询出现超时,一个一个条件减少尝试,前几个where条件不超时,而在加上最后一个条件时就超时了. 分析表的索引建立情况:DBCC showconti ...

  2. Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录

    一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...

  3. linux-IO重定向-文本流重定向

    输出重定向的追加和覆盖 标准输出就这两种: 覆盖和追加 >> 是重定向操作符 1 是 命令的文件描述符 重定向操作符合文件描述符之间不能存在空白符 否则1会被当做是文件被读取 将正确和错误 ...

  4. this.$http.post ||this.$http.put||vue 获取url参

    getClasslist() { this.$http.get('/xxxxx/childlist', { params: { ServiceUnitId: localStorage.getItem( ...

  5. 1013 C. Photo of The Sky

    传送门 [http://codeforces.com/contest/1013/problem/C] 题意 输入一个n代表n颗星星,输入2n个数,其中任意两个数代表一颗行星的坐标,问你把n个星星围起来 ...

  6. 【Beta版本发布】爬虫队长装备全面更新!

    一.Beta阶段目标回顾 1.为了解决Alpha阶段线程异常泛滥的问题,我们需要一个线程池. 2.为了爬取得到的文件正确可用,我们需要一个异常清理器. 3.为了不间断爬取,管理员不必频繁运行程序点,我 ...

  7. eclipse中git的author和commiter的修改

    项目目录,隐藏的文件.git的文件夹,config文件 eclipse-->右击项目--showin--system explorer.git 打开config文件加上 [user] name ...

  8. JAVA面对对象(三)——Super、static、final关键字

    Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...

  9. opencv学习笔记(二)

    摘要:学习资料主要参考于毛星云主编<opencv3编程入门> 1.图像显示 #include<opencv2/opencv.hpp> using namespace cv; / ...

  10. MyBatis 集合操作语法范例:配合SQL的in关键字

    Java语法: private String[] tagIds; MyBatis语法 <delete id="deleteByIds" parameterType=" ...