博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 617 E. XOR and Favorite Number
阅读量:4520 次
发布时间:2019-06-08

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

题目链接:

  

题目描述:

  给出n个数,m次查询,每次查询在区间[l, r]里面有多少对(i, j),满足a^ ai+1 ^ ai+2 ^ ...... ^ aj-1 ^ aj == k

解题思路:

  莫队算法,在线性复杂度内进行转移,问题关键在与如何进行状态转移,我们设定 sum[i] 为[1, i]区间内的异或和,对于区间[a, b]的异或和为sum[b] ^ sum[a-1]。如果区间 [a, b] 的异或和为k,则有sum[b] ^ sum[a-1] == k,由于异或的性质可以推论出:sum[b] ^ k == sum[a-1],sum[a-1] ^ k == sum[b]。

1 /** 2     ans要用LL, 3     num[]要在k的范围内扩大两倍 4 */ 5 #include 
6 #include
7 #include
8 #include
9 #include
10 using namespace std;11 12 typedef __int64 LL;13 const int maxn = 100010;14 struct node15 {16 int l, r, id;17 } q[maxn];18 LL ans[maxn];19 int b[maxn], num[maxn*20];20 int n, m, k, lb;21 22 bool cmp (node x, node y)23 {24 if (x.l / lb == y.l / lb)25 return x.r < y.r;26 return x.l < y.l;27 }28 void solve ()29 {30 int l, r;31 LL tmp;32 l = r = tmp = 0;33 num[0] = 1;34 35 for (int i=0; i
q[i].r)45 {46 num[b[r]] --;47 tmp -= num[b[r]^k];48 r --;49 }50 51 while (l < q[i].l - 1)52 {53 num[b[l]] --;54 tmp -= num[b[l] ^ k];55 l ++;56 }57 58 while (l > q[i].l - 1)59 {60 l --;61 tmp += num[b[l] ^ k];62 num[b[l]] ++;63 }64 65 ans[q[i].id] = tmp;66 }67 }68 69 int main ()70 {71 while(scanf ("%d %d %d", &n, &m, &k) != EOF)72 {73 b[0] = 0;74 lb = (int) sqrt (n);75 76 for (int i=1; i<=n; i++)77 {78 scanf ("%d", &b[i]);79 b[i] ^= b[i-1];80 }81 82 for (int i=0; i

 

转载于:https://www.cnblogs.com/alihenaixiao/p/5473194.html

你可能感兴趣的文章
ORACLE 建库过程总结
查看>>
Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
查看>>
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...
查看>>
c# Winform 开发分屏显示应用程序
查看>>
canvas刮奖
查看>>
qt下拖放(一)
查看>>
Linux后台运行python程序并输出到日志文件
查看>>
HTML的语义化和一些简单优化
查看>>
jQuery基础教程
查看>>
Spring 在xml文件中配置Bean
查看>>
poj1611(简答并查集)
查看>>
基于scap的服务器安全基线核查设计与实现
查看>>
NFS 安装与配置
查看>>
javascript 模拟滚动 隐藏滚动条
查看>>
深度探索C++对象模型读书笔记(2)
查看>>
Linux下不停止服务,清空nohup.out文件
查看>>
C++11 Intro - Thread Id
查看>>
帝国CMS操作类型一览表
查看>>
spring boot开发环境搭建
查看>>
手把手教你使用 Clion 开发 Linux C++ 项目
查看>>