博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4888][TJOI2017]异或和(树状数组)
阅读量:4356 次
发布时间:2019-06-07

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

 

题目描述

在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的。所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单。但今天小明遇到了一个序列和的难题,这个题目不仅要求你快速的求出所有的连续和,还要快速的求出这些连续和的异或值。小明很快的就求出了所有的连续和,但是小明要考考你,在不告诉连续和的情况下,让你快速求是序列所有连续和的异或值。

输入输出格式

输入格式:

 

第一行输入一个n,表示这序列的数序列 第二行输入n个数字a1,a2...an代表这个序列

0<=a1,a2,...an,0<=a1+a2...+an<=10^6

 

输出格式:

 

输出这个序列所有的连续和的异或值

 

输入输出样例

输入样例#1: 
31 2 3
输出样例#1: 
0

说明

【样例解释】

序列1 2 3有6个连续和,它们分别是1 2 3 3 5 6,则1 xor 2 xor 3 xor 3 xor 5 xor 6 = 0

【数据范围】

对于20%的数据,1<=n<=100

对于100%的数据,1<=n <= 10^5

区间和转换成前缀和之差,树状数组分情况讨论即可。

1 #include
2 #include
3 #include
4 #define rep(i,l,r) for (int i=l; i<=r; i++) 5 using namespace std; 6 7 const int N=100100,M=1000000; 8 int flag,cnt,c[M+5][2],s[N],a[N],ans; 9 int pw[21],n;10 11 void add(int x,int y){ while (x<=M) c[x][y]++,x+=(x&(-x)); }12 int query(int x,int y){13 int sum=0; while (x) sum+=c[x][y],x-=(x&(-x));14 return sum;15 }16 17 int main(){18 scanf("%d",&n);19 rep(i,1,n) scanf("%d",&s[i]),s[i]+=s[i-1];20 pw[0]=1; rep(i,1,20) pw[i]=pw[i-1]*2;21 rep(i,0,20)22 if (pw[i]<=s[n]){23 memset(c,0,sizeof(c));24 flag=0; add(1,0);25 rep(j,1,n){26 int tmp=s[j]&pw[i];27 if (tmp) cnt=query(a[j]+1,0)+query(1000001,1)-query(a[j]+1,1);28 else cnt=query(a[j]+1,1)+query(1000001,0)-query(a[j]+1,0);29 if (cnt%2==1) flag^=1;30 add(a[j]+1,(bool)tmp);31 if (tmp) a[j]|=pw[i];32 }33 if (flag) ans|=(pw[i]);34 }35 printf("%d\n",ans);36 return 0;37 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8457651.html

你可能感兴趣的文章
加班与效率
查看>>
轻量级Modal模态框插件cta.js
查看>>
MyEclipse下SpringBoot+JSP整合过程及踩坑
查看>>
重定向和管道
查看>>
实验五
查看>>
STL学习笔记(第二章 C++及其标准程序库简介)
查看>>
Operator_countByValue
查看>>
Java 日期往后推迟n天
查看>>
Web应用漏洞评估工具Paros
查看>>
Git 和 Github 使用指南
查看>>
20180925-4 单元测试
查看>>
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>
linux下使用dd命令写入镜像文件到u盘
查看>>
001---进程
查看>>