4017: 小Q的无敌异或

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 593  Solved: 197
[Submit][Status][Discuss]

Description

背景
 
小Q学习位运算时发现了异或的秘密。
 
描述
 
小Q是一个热爱学习的人,他经常去维基百科(http://en.wikipedia.org/wiki/Main_Page)学习计算机科学。
 
就在刚才,小Q认真地学习了一系列位运算符(http://en.wikipedia.org/wiki/Bitwise_operation),其中按位异或的运算符 xor 对他影响很大。按位异或的运算符是双目运算符。按位异或具有交换律,即i xor j = j xor i。
 
他发现,按位异或可以理解成被运算的数字的二进制位对应位如果相同,则结果的该位置为0,否则为1,例如1(01) xor 2(10) = 3(11)。
 
他还发现,按位异或可以理解成数字的每个二进制位进行了不进位的加法,例如3(11) xor 3(11) = 0(00)。
 
于是他想到了两个关于异或的问题,这两个问题基于一个给定的非负整数序列A1, A2, ..., An,其中n是该序列的长度。
 
第一个问题是,如果用f(i, j)表示Ai xor Ai+1 xor ... xor Aj,则任意的1 <= i <= j <= n的f(i, j)相加是多少。
 
第二个问题是,如果用g(i, j)表示Ai + Ai+1 + ... + Aj,则任意的1 <= i <= j <= n的g(i, j)异或在一起是多少。
 
比如说,对于序列{1, 2},所有的f是{1, 2, 1 xor 2},加起来是6;所有的g是{1, 2, 1 + 2},异或起来是0。
 
他觉得这两个问题都非常的有趣,所以他找到了你,希望你能快速解决这两个问题,其中第一个问题的答案可能很大,你只需要输出它对998244353(一个质数)取模的值即可。
 

Input

第一行一个正整数n,表示序列的长度。
 
第二行n个非负整数A1, A2, ..., An,表示这个序列。
 

Output

两个整数,表示两个问题的答案,空格隔开,其中第一个问题的答案要对998244353(一个质数)取模。
 

Sample Input

2
1 2

Sample Output

6 0
 

此题求解该序列所有可能存在的子区间的异或和以及和的异或。
对于第一问求解区间的异或和。这一问在2017西安现场赛G题出现过,只不过把整个区间改为询问指定的区间。那么我们把每个数拆开,一位一位地来算贡献。在某一位上,我们做一个异或的前缀和,即把+换为^。那我们要求解某个区间[l,r]的异或值,即为sum(r)^sum(l-1)。包含0位置在内共有n+1个端点。我们统计下这个前缀和为1的端点数有k个,那么为0的就有(n+1-k)个,那么区间俩端点必须由不同数组成异或才为1(即sum(r)和sum(l-1)),这样的区间我们能选择k*(n+1-k),这即为第一问答案。
对于第二问。我们依旧拆开一位一位做。假如这是第k位,我们做%(2k+1)的前缀和。
如果第k位为1 ,那么(sum(r)−sum(l−1))mod 2k+1≥2k,这点显而易见。
用ans存这位是否为1,。我们从小到大枚举r,看满足这个等式的l-1是否为奇数个,如果是则ans^=1,否则不管。
但这东西不拆开来是不好做的。这个式子拆开 mod前的数并变换可以得出两个式子来限定sum(l-1)%(2k+1)的取值范围:
  1. sum(l−1)mod 2k+1≤(sum(r)mod2k+1)−2,0≤sum(l−1)mod2k+1 ,即 0≤sum(l−1)mod2k+1≤(sum(r)mod2k+1)−2k
  2. sum(l−1)mod2k+1≤(sum(r)mod2k+1)−2k+2k+1=(sum(r)mod2k+1)+2,sum(r)mod2k+1<sum(l−1)mod2k+1 ,即 sum(r)mod2k+1<sum(l−1)mod2k+1≤(sum(r)mod2k+1)+2

我们先离散化所有前缀和的值。在枚举r的过程中,然后看对应区间内的数量是不是奇数个,这个可以用^的树状数组实现。或者权值线段树实现。

这样枚举了右端点后,就能得出ans,若为1则加上相应的2的幂次方作为答案贡献。

  1. #include<bits/stdc++.h>
  2. #define clr(x) memset(x,0,sizeof(x))
  3. #define clr_1(x) memset(x,-1,sizeof(x))
  4. #define LL long long
  5. #define mod 998244353
  6. using namespace std;
  7. const int N=1e5+;
  8. int bit[N];
  9. LL a[N];
  10. LL order[N],found[N];
  11. int n,m,k,cnt;
  12. LL ans1,ans2;
  13. void qy1(int mp)
  14. {
  15. LL num=;
  16. LL now=;
  17. for(int i=;i<=n;i++)
  18. {
  19. now^=(a[i]>>mp)&;
  20. if(now)
  21. num++;
  22. }
  23. ans1=(ans1+num*(n-num+)%mod*(1LL<<mp)%mod)%mod;
  24. return ;
  25. }
  26. void add(int i,int x)
  27. {
  28. if(!i) return ;
  29. while(i<=cnt+)
  30. {
  31. bit[i]^=x;
  32. i+= i&-i;
  33. }
  34. return ;
  35. }
  36. int sum(int i)
  37. {
  38. int res=;
  39. while(i)
  40. {
  41. res^=bit[i];
  42. i-= i&-i;
  43. }
  44. return res;
  45. }
  46. void qy2(int mp)
  47. {
  48. clr(bit);
  49. int p;
  50. found[]=order[]=;
  51. for(int i=;i<=n;i++)
  52. {
  53. found[i]=(found[i-]+a[i])%(1LL<<(mp+));
  54. order[i]=found[i];
  55. }
  56. sort(order,order+n+);
  57. cnt=unique(order,order+n+)-order-;
  58. int ans=;
  59. for(int i=;i<=n;i++)
  60. {
  61. p=lower_bound(order,order+cnt+,found[i])-order;
  62. if(order[p]!=found[i]) p--;
  63. p++;
  64. add(p,);
  65. ans^=sum(p);
  66. p=lower_bound(order,order+cnt+,found[i]-(1LL<<mp))-order;
  67. if(order[p]!=found[i]-(1LL<<mp)) p--;
  68. p++;
  69. ans^=sum(p);
  70. p=lower_bound(order,order+cnt+,found[i]+(1LL<<mp))-order;
  71. if(p==cnt+ || order[p]!=found[i]+(1LL<<mp)) p--;
  72. p++;
  73. ans^=sum(p);
  74. }
  75. if(ans) ans2|=(1LL<<mp);
  76. return ;
  77. }
  78. int main()
  79. {
  80. scanf("%d",&n);
  81. for(int i=;i<=n;i++)
  82. scanf("%lld",&a[i]);
  83. ans1=ans2=;
  84. for(int i=;i<=;i++) qy1(i);
  85. for(int i=;i<=;i++) qy2(i);
  86. printf("%lld %lld\n",ans1,ans2);
  87. return ;
  88. }

bzoj 4017: 小Q的无敌异或的更多相关文章

  1. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...

  2. BZOJ4017 小Q的无敌异或(位运算)

    题目链接 小Q的无敌异或 好久之前做的这道题了……参照了别人的博客……还是没有全懂. 第一个问题维护个前缀就好了,第二个问题还要用树状数组维护…… #include <bits/stdc++.h ...

  3. bzoj 4815 小Q的表格 —— 反演+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 思路就和这里一样:https://blog.csdn.net/leolyun/arti ...

  4. BZOJ [Cqoi2017] 小Q的棋盘

    题解:枚举最后在哪里停止,然后剩下的步数/2 也就是找最大深度 枚举终止位置算是一种思路吧 #include<iostream> #include<cstdio> #inclu ...

  5. bzoj 4813: [Cqoi2017]小Q的棋盘

    Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2-,V- ...

  6. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  7. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  8. 【BZOJ 5125】小Q的书架

    Problem Description 小 \(Q\) 有 \(n\) 本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小 \(Q\) 希望把这一排书分成恰好 \(k\) 段,使 ...

  9. 腾讯笔试题:小Q硬币组合

    腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...

随机推荐

  1. js_在原有的日期上添加天数输出添加后的日期

    开始编码工作也有段时间了,想想没有留下点什么,有点遗憾.学到的一些经验,写写,分享一下.也给自己整理一下. 今天分享一下,在原有的日期上添加天数输出添加后的日期.开始做的时候,简单的思路是,直接用ne ...

  2. 5.0docer 网络链接

    docker0 :linux的虚拟网桥 虚拟网桥特点: 1.可以设置ip地址 2.相当于拥一个隐藏的虚拟网卡     安装网桥工具 apt-get install bridge-utils brctl ...

  3. mouseover/mouseenter/mouseout/mouseleave的区别

    mouseover:鼠标指针穿过被选元素或其子元素,均会触发事件 mouseenter:鼠标指针穿过被选元素时才触发事件 mouseout:鼠标指针离开被选元素或其子元素则触发事件 mouseleav ...

  4. 编写jquery Plugin

    编写jquery插件的原则 1.给$.fn绑定函数,实现插件的代码逻辑 2.插件函数最后要return this,以支持链式调用 3.插件函数要有默认值,绑定在$.fn.<pluginName& ...

  5. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

  6. Redis错误:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

    原文链接:http://blog.csdn.net/rchm8519/article/details/48347797 redis.clients.util.Pool.getResource(Pool ...

  7. 调用微信JS-SDK接口上传图片

    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...

  8. MUI 页面刷新及页面传值问题

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  9. ip和子网掩码的判断

     只要记住B类IP的范围就好了(128以下的是A,128~191是B段,192以上是C段) 比如B类,网络地址为前两段,后面两段是主机地址,所以网络标识应该是255.255.0.0

  10. HDU 4768: Flyer

    题意: 有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2...  && A+k*C <= B).题目保证最多有一个人收到的传单数是奇数. ...