题目链接

BZOJ4888

题解

要求所有连续异或和,转化为任意两个前缀和相减

要求最后的异或和,转化为求每一位\(1\)的出现次数

所以我们只需要对每一个\(i\)快速求出\(sum[i] - sum[j] \quad [j < i]\)当前位的\(1\)的个数

显然是将前\(i\)个数放到某一个数据结构中查询

我的思路到这里停住

两个数相减,要第\(b\)位为\(1\),我们放到具体情境中观察:

假若\(sum[i]\)的第\(b\)位为\(1\)

....1....

....?....

1、如果\(?=0\)

就是

....1....

....0....

发现\(1\)后面的数大于等于 \(0\)后面的数,为此时相减后该位为\(1\)的充要条件

2、如果\(?=1\)

就是

....1....

....1....

发现\(sum[i]\)的\(1\)后面的数小于\(sum[j]\)的\(1\)后面的数,为此时相减后该位为\(1\)的充要条件

如果第\(b\)位为\(0\)也是类似的讨论

如果我们将该位为\(0\)和\(1\)的数分开讨论,现在问题就转化为了,如何快速求当前某一范围内的数的个数

显然就是对\(0\)和\(1\)分别开一个权值树状数组啦

题目中\(a[i]\)之和\(\le 10^6\)的条件也是一个明显的暗示

这样我们就用\(O(log_2(max\{a_i\}) * nlog\sum a_i) \approx O(nlog^2n)\)的时间复杂度做出这道题了

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. #define lbt(x) (x & -x)
  14. using namespace std;
  15. const int maxn = 100005,maxm = 1000005,INF = 1000000000;
  16. inline int read(){
  17. int out = 0,flag = 1; char c = getchar();
  18. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  19. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  20. return out * flag;
  21. }
  22. int MX = 1000001;
  23. struct BIT{
  24. int s[maxm];
  25. void clear(){cls(s);}
  26. void add(int u){while (u <= MX) s[u]++,u += lbt(u);}
  27. int query(int u){int re = 0; while (u) re += s[u],u -= lbt(u); return re;}
  28. int sum(int l,int r){return query(r) - query(l - 1);}
  29. }T0,T1;
  30. int n,a[maxn],mx;
  31. bool check(int b){
  32. T0.clear(); T1.clear();
  33. LL cnt = 0; int tmp;
  34. for (int i = 0; i <= n; i++){
  35. tmp = a[i] % b + 1;
  36. if (a[i] & b){
  37. cnt += T0.sum(1,tmp) + T1.sum(tmp + 1,MX);
  38. T1.add(tmp);
  39. }
  40. else {
  41. cnt += T0.sum(tmp + 1,MX) + T1.sum(1,tmp);
  42. T0.add(tmp);
  43. }
  44. }
  45. return cnt & 1;
  46. }
  47. int main(){
  48. n = read(); int x,ans = 0;
  49. REP(i,n) a[i] = a[i - 1] + (x = read()),mx = max(mx,a[i]);
  50. for (int i = 0; mx; i++,mx >>= 1){
  51. if (check(1 << i)) ans += (1 << i);
  52. }
  53. printf("%d\n",ans);
  54. return 0;
  55. }

BZOJ4888 [Tjoi2017]异或和 【树状数组】的更多相关文章

  1. [BZOJ4888][TJOI2017]异或和(树状数组)

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

  2. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  3. Luogu3760 TJOI2017 异或和 树状数组

    传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...

  4. 【Foreign】异色弧 [树状数组]

    异色弧 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...

  5. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  6. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

  7. [CSP-S模拟测试]:异或(树状数组+LCA)

    题目传送门(内部题21) 输入格式 第一行一个字符串$str$,表示数据类型.第二行一个正整数$k$,表示集合$K$的大小,保证$k>1$.接下来$k$行每行$k$个数,第$i$行第$j$个数表 ...

  8. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

  9. BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位

    题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...

随机推荐

  1. LeetCode47.Permutations II(剑指offer38-1)

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  2. 爬虫学习(十六)——jsonpath

    jsonpath介绍 jsonpath是一种信息抽取类库,是从json文档中抽取指定信息的工具,提供多种语言实现的版本 jsonpath对json来说,就相当于xpath对于xml jsonpath和 ...

  3. motto - question - bodyParser.urlencoded 中设置 extended 为 true 和 false 有什么区别吗?

    本文搜索关键字:motto node nodejs js javascript body-parser bodyparser urlencoded x-www-form-urlencoded exte ...

  4. 给网站添加icon图标

    只需制成ico结尾的图片即可

  5. 一件安装lnmp

    wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && ...

  6. JDK学习---深入理解java中的LinkedList

    本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn. ...

  7. MySQL的备份

    MySQL的备份 开启MySQL的log_bin 执行查看mysql的log_bin状态 > show variables like 'log_bin%'; +----------------- ...

  8. Educational Codeforces Round 43 E. Well played!(贪心)

    E. Well played! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. POJ 1222 反转

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12469   Accepted: 7 ...

  10. perl语言入门总结-第4章-子程序

    子程序定义和返回值 sub sum{ print "调用了子程序\n"; $a + $b; #后一行为返回值 } ; ; $s =∑ #34 调用子程序 子程序中的参数,参数固定( ...