题面

长度为\(n\)的数列,现有两种操作:

1、区间异或操作

2、区间求和操作

对于每个查询,输出答案

思路:

线段树+二进制拆位

线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方法显然是行不通的,于是就考虑二进制拆位

主要的思路就是将一个数,拆成若干个二进制位,然后对于异或操作,就转换成了每一位上异或操作

分类讨论一下:

1、当\(x\)的第\(i\)位为\(1\)时,\(1\ xor\ 0=1\),\(1\ xor\ 1=0\)

也就是看成区间取反操作

2、当\(x\)的第\(i\)位为\(0\)时,\(0\ xor\ 0=0\),\(0\ xor\ 1=1\)

也就是说操作前后没有变化,所以就不执行修改操作

Code:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 100010
  4. using namespace std;
  5. int n,a[N],res,L,R,T,x;
  6. int f[N<<2][25],tag[N<<2][25];//1e6<2^20
  7. ll b[25],ans;//别忘记long long
  8. int read(){ int s=0;char c=getchar();
  9. while(!isdigit(c)) c=getchar();
  10. while(isdigit(c)){s=(s<<1)+(s<<3)+c-'0';c=getchar();}
  11. return s;
  12. }
  13. void built(int k,int l,int r)
  14. {
  15. if(l>r) return;
  16. if(l==r)
  17. {
  18. res=a[l];
  19. for(int i=0;i<21;i++)//拆位
  20. if((res>>i)&1) f[k][i]=1;
  21. return;
  22. }
  23. int mid=(l+r)>>1,cur=k<<1;
  24. built(cur,l,mid);
  25. built(cur|1,mid+1,r);
  26. for(int i=0;i<21;i++)
  27. f[k][i]=f[cur][i]+f[cur|1][i];
  28. return;
  29. }
  30. void push(int k,int l,int r,int p)//p表示第几位
  31. {
  32. f[k][p]=(r-l+1)-f[k][p];//区间取反
  33. if(l!=r)
  34. {
  35. int cur=k<<1;
  36. tag[cur][p]^=1;
  37. tag[cur|1][p]^=1;
  38. }
  39. tag[k][p]=0;
  40. }
  41. void Modify(int k,int l,int r,int p)//p同上
  42. {
  43. if(tag[k][p]) push(k,l,r,p);
  44. if(r<L||R<l) return;
  45. if(L<=l&&r<=R)
  46. {
  47. push(k,l,r,p);
  48. return;
  49. }
  50. int mid=(l+r)>>1,cur=k<<1;
  51. Modify(cur,l,mid,p);
  52. Modify(cur|1,mid+1,r,p);
  53. f[k][p]=f[cur][p]+f[cur|1][p];
  54. }
  55. void Query(int k,int l,int r)//查询,所有位的懒标记都要下放
  56. {
  57. for(int i=0;i<21;i++)
  58. if(tag[k][i]) push(k,l,r,i);
  59. if(r<L||R<l) return;
  60. if(L<=l&&r<=R)
  61. {
  62. for(int i=0;i<21;i++) ans+=f[k][i]*b[i];
  63. return;
  64. }
  65. int mid=(l+r)>>1,cur=k<<1;
  66. Query(cur,l,mid);
  67. Query(cur|1,mid+1,r);
  68. }
  69. int main()
  70. {
  71. int i,j;b[0]=1;
  72. for(i=1;i<=21;i++) b[i]=b[i-1]<<1;//初不初始化都可以,就是上面b[i]要变成1<<i
  73. n=read();
  74. for(i=1;i<=n;i++) a[i]=read();
  75. built(1,1,n);
  76. T=read();
  77. while(T--)
  78. {
  79. if(read()==1)
  80. {
  81. L=read();R=read();ans=0;
  82. Query(1,1,n);
  83. printf("%lld\n",ans);
  84. }
  85. else
  86. {
  87. L=read();R=read();x=read();
  88. for(i=0;i<21;i++)//判断x的第i位是不是1,并进行修改
  89. if((x>>i)&1) Modify(1,1,n,i);
  90. }
  91. }
  92. return 0;
  93. }

「CF242E」XOR on Segment 解题报告的更多相关文章

  1. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  2. 「NOI2013」树的计数 解题报告

    「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力 ...

  3. 「NOI2016」优秀的拆分 解题报告

    「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...

  4. 「NOI2016」循环之美 解题报告

    「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...

  5. 「FJOI2018」领导集团问题 解题报告

    「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...

  6. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...

  7. 「SP122」STEVE - Voracious Steve 解题报告

    SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...

  8. 「Luogu」[JSOI2007]字符加密 解题报告

    题面 思路: 作为一个后缀数组的初学者,当然首先想到的是后缀数组 把\(s\)这个串首尾相接,扩展为原来的两倍,就能按后缀数组的方法处理 证明: 神仙一眼就看出这是后缀的裸题,我这个蒟蒻想了半天想不出 ...

  9. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

随机推荐

  1. Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法

    今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数def liebiao(): for x in range(10): yield x#函数调 ...

  2. python selenium 测试浏览器(IE,FF,Chrome)

    browser_engine.py # coding=utf-8 from selenium import webdriver class BrowserEngine(object): "& ...

  3. 测试代码的执行时间魔法方法%time和%timeit

    对于规模更大.运行时间更长的数据分析应用程序,你可能会希望测试一下各个部分或函数调用或语句的执行时间.你可能会希望了解某个复杂计算过程中到底是哪些函数占用的时间最多.幸运的是,在开发和测试代码的过程中 ...

  4. hadoop2.6.0 + hbase-1.0.0 伪分布配置

    1 基本配置 主机名: 192.168.145.154 hadoop2 ======= 2 etc/hadoop下文件配置 1)core-site.xml <configuration> ...

  5. Taglib自定义万能标签扩展 DownLoad

    http://www.thinkphp.cn/extend/538.html 用ThinkPHP的标签做网站觉得不够快速,就自己写了一个扩展,感觉挺好的,分享出来,给有需要的TPER. 复制代码 &l ...

  6. jq常用动画fade slide

    https://www.cnblogs.com/sandraryan/ hide(); <div class="box">big box</div> $(' ...

  7. Python--day65--模板语言之tags

    Tags for循环 普通for循环 <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% en ...

  8. dos taskkill 命令

    C:\Users\asn\Desktop>taskkill /? TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter ...

  9. JPA一对多循环引用的解决&&JackSon无限递归问题

    说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...

  10. 【codeforces 761D】Dasha and Very Difficult Problem

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...