传送门

•题意

  给你一个包含 n 个数的序列 a,定义序列上的两个操作:

    (1)$1,l,r\ :\ ans=\sum_{i=l}^{r}a_i$;

    (2)$2,l,r,x\ :\ \forall\ i \in[l,r],a_i = a_i\ xor\ x$;

  输出操作(1)对应的 ans 值;

•题解

  因为是异或操作,而异或设计的运算都是在二进制上进行的;

  所以考虑按照二进制位建立线段树;

  对于每个叶节点,将对应的数转化成二进制的每一位存入到节点信息中;

  然后就是区间更新,区间查询操作;

•Code

  CodeForces242E(1).cpp

•CF242E升级版

  题目来源与 【2019ICPC亚洲区域赛银川赛站网络预选赛A. Simple Data Structures

  相比于 CF242E 这道题,对序列的操作增加了两个:

    (1)$1,l,r\ :\ ans=\sum_{i=l}^{r}a_i$;

    (2)$2,l,r,x\ :\ \forall\ i \in[l,r],a_i = a_i\ xor\ x$;

    (3)$2,l,r,x\ :\ \forall\ i \in[l,r],a_i = a_i\ |\  x$

    (4)$2,l,r,x\ :\ \forall\ i \in[l,r],a_i = a_i\ \&\  x$

•思路

  和上题思路差不多,考虑到开 20 棵线段树维护以上操作;

  难点在于如何 lazy,以及如何 pushDown();

  考虑到 ^,|,& 的特点;

  对于某个数的二进制的第 i 位,假设为 bit[i];

  易得 bit[i] ^ 0 = bit[i] , bit[i] | 0 = bit[i] , bit[i] &1 = bit[i];

     bit[i] ^ 1 : 相当于反转 bit[i];

     bit[i] | 1 = 1;

     bit[i] & 0 = 0;

  也就是说只有后三个操作才有用;

  考虑到 bit[i] 可能在这之前不止做依次操作;

  但是有一点可以肯定,遇到 bit[i] | 1,bit[i] = 1,不管其之前做过何种操作;

  同样,遇到 bit[i]&0,bit[i]=0;

  而如果先遇到 &0 , 在遇到 ^ 1,相当于将 bit[i] 赋值为 1;

  反之,如果先遇到 |1 , 在遇到 ^ 1,相当于将 bit[i] 赋值为 0;

  这样的话,定义 lazy 有四个取值:

    $lazy=\begin{cases} -1\ ,\ no\ operate\\ \ 0\ \ ,\ become\ 0 \\ \ 1\ \ ,\ become\ 1 \\ \ 2\ \ ,\ reverse\end{cases}$;

  向下传递懒惰标记的时候,要结合父节点的 lazy 和子节点的 lazy 进行更新;

•Code

  CodeForces242E(2).cpp

CodeForces 242E "XOR on Segment"(线段树)的更多相关文章

  1. codeforces 242E. XOR on Segment 线段树

    题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...

  2. codeforces 22E XOR on Segment 线段树

    题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...

  3. codeforces 242E - XOR on Segment (线段树 按位数建树)

    E. XOR on Segment time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...

  4. CodeForces 242E - XOR on Segment 二维线段树?

    今天练习赛的题....又是线段树的变换..拿到题我就敲了个点更新区间查询的..果断超时...然后想到了可以将每个数与合表示成不进位的二进制数..这样就可以区间进行更新了..比赛的时候写搓了..刚重写了 ...

  5. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  6. XOR on segment(线段树区间异或更新)

    原题传送门 本题大意:给定n个数字和m个操作,操作共有两种,第一种是求解区间l到r上元素的和,第二种是将区间l到r的元素都异或一个x,作为某个位置的新值. 很容易想到线段树维护区间和,但是我们发现,在 ...

  7. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  8. luogu P2574 XOR的艺术 (线段树)

    luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...

  9. CodeForces 516C Drazil and Park 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/8990745.html 题目传送门 - CodeForces 516C 题意 在一个环上,有$n$棵树. 给出每一 ...

随机推荐

  1. 地不安装Oracle,plsql远程连接数据库

    由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...

  2. buffer的相关小知识

    php与mysql的连接有三种方式,mysql,mysqli,pdo.不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别. 什么叫使用buffer和不使用buffer呢? 客户端 ...

  3. github遇到 non-fast-forward错误

    可以参考:这里 解决过程如图所示

  4. 【怪物】KMP畸形变种——扩展KMP

    问题 参考51nod1304这道题: 很显然我们要求的是S的每个后缀与S的最长公共前缀的长度之和. 暴力 假设我们把next[i]表示为第i个后缀与S的最长公共前缀的长度. 现在我们想了:这个next ...

  5. qt开发ROS遇到这个问题 find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH...

    为了实现用Qt开发ROS界面开发环境,我几乎参阅了网上所有的配置教程,安装了多个版本的qt,在ubuntu14.04和ubuntu16.04上分别进行了配置,最后都成功了.不得不说的是用QTCREAT ...

  6. 微服务开源生态报告 No.1

    从关注开源,到使用开源,再到参与开源贡献,越来越多的国内开发者通过开源技术来构建业务. 截止目前,Arthas / Dubbo / ChaosBalde / Nacos / RocketMQ / Se ...

  7. 6 获取请求头和URL信息

    @app.route("/req",methods=['GET','POST'])def req(): print(request.headers) #请求头的信息全部在这里面 p ...

  8. EC Round 33 F. Subtree Minimum Query 主席树/线段树合并

    这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...

  9. codeforces2B.The least round way 题解 动态规划/模拟

    题目出处:http://codeforces.com/problemset/problem/2/B 题目描述 给你一个 \(n \times n\) 的二维数组,它包含的元素都是非负整数.你需要寻找一 ...

  10. js切割字符串

    var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8);   console.log(t);   输出  19-9-10