博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[51nod]2128 前缀异或【数学题】
阅读量:4692 次
发布时间:2019-06-09

本文共 1129 字,大约阅读时间需要 3 分钟。

2128 前缀异或

基准时间限制:2 秒 空间限制:131072 KB 分值: 5 难度:1级算法题


输入一个长度为n(1<=n<=100000)n(1<=n<=100000)数组a[1],a[2],...,a[n]a[1],a[2],...,a[n]

输入一个询问数m(1<=m<=100000)m(1<=m<=100000)和m组询问,每组询问形如(l,r)(l,r)
对于每组询问(l,r)(l,r),你需要输出a[l]xora[l+1]xor...xora[r1]xora[r]a[l]xora[l+1]xor...xora[r−1]xora[r],即第l个数字到第r个数字的异或。
如果你的算法需要约nmn∗m的时间,你将只能通过第一个测试点。
如果你的算法需要约n+mn+m的时间,你将可以通过本题。

Input

第一行一个整数n
第二行为n个整数a[1], a[2], … a[n]
第三行一个整数m
接下来m行,每行两个整数l, r表示询问。

Output

输出一共m行,对于每一个询问输出一个整数表示结果。

Input示例

3

1 2 3
6
1 1
2 2
3 3
1 2
2 3
1 3

Output示例

1

2
3
3
1
0

wwwwodddd (题目提供者)

C++的运行时限为:2000 ms ,空间限制为:131072 KB 示例及语言说明请按这里

题解

我们知道Xor同一个数两次等于什么都没干,那么就令sum[i]=a[1] xor a[2] xor…xor a[i],我们取答案时就sum[R] xor sum[L-1]就可以了。Xo r在C++里是 ^。

代码如下

#include
using namespace std;int n,q,a[100005];int main(){// freopen("prob.in","r",stdin);// freopen("prob.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); a[i]^=a[i-1]; } scanf("%d",&q); for(int i=1;i<=q;i++){ int L,R;scanf("%d%d",&L,&R); printf("%d\n",a[R]^a[L-1]); } return 0;}

转载于:https://www.cnblogs.com/XSamsara/p/9059402.html

你可能感兴趣的文章
宏的方式显示ALV
查看>>
数据库设计三大范式的理解
查看>>
20180702小测
查看>>
13个 ASP.NET MVC 的扩展
查看>>
Navicat Premium 连接MySQL数据库出现Authentication plugin 'caching_sha2_password' cannot be loaded的解决方案...
查看>>
bzoj3527 [Zjoi2014]力
查看>>
漫谈:机器学习中距离和相似性度量方法
查看>>
二重循环
查看>>
对于软件工程的期待
查看>>
C++初识
查看>>
xml读取
查看>>
Linux编程环境
查看>>
说说final关键字(好像有干货)
查看>>
ps 常用快捷键
查看>>
算术基本定理
查看>>
HDU 1629 迷宫城堡
查看>>
codeforces 390C Inna and Candy Boxes
查看>>
JNDI是什么
查看>>
Oracle用户被锁定解决方法
查看>>
jsoup Java HTML解析器:使用选择器语法来查找元素
查看>>