CodeForces 242E "XOR on Segment"(线段树)
•题意
给你一个包含 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
•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
CodeForces 242E "XOR on Segment"(线段树)的更多相关文章
- codeforces 242E. XOR on Segment 线段树
题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...
- codeforces 22E XOR on Segment 线段树
题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...
- codeforces 242E - XOR on Segment (线段树 按位数建树)
E. XOR on Segment time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...
- CodeForces 242E - XOR on Segment 二维线段树?
今天练习赛的题....又是线段树的变换..拿到题我就敲了个点更新区间查询的..果断超时...然后想到了可以将每个数与合表示成不进位的二进制数..这样就可以区间进行更新了..比赛的时候写搓了..刚重写了 ...
- 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. 这题 ...
- XOR on segment(线段树区间异或更新)
原题传送门 本题大意:给定n个数字和m个操作,操作共有两种,第一种是求解区间l到r上元素的和,第二种是将区间l到r的元素都异或一个x,作为某个位置的新值. 很容易想到线段树维护区间和,但是我们发现,在 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- CodeForces 516C Drazil and Park 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/8990745.html 题目传送门 - CodeForces 516C 题意 在一个环上,有$n$棵树. 给出每一 ...
随机推荐
- 地不安装Oracle,plsql远程连接数据库
由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...
- buffer的相关小知识
php与mysql的连接有三种方式,mysql,mysqli,pdo.不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别. 什么叫使用buffer和不使用buffer呢? 客户端 ...
- github遇到 non-fast-forward错误
可以参考:这里 解决过程如图所示
- 【怪物】KMP畸形变种——扩展KMP
问题 参考51nod1304这道题: 很显然我们要求的是S的每个后缀与S的最长公共前缀的长度之和. 暴力 假设我们把next[i]表示为第i个后缀与S的最长公共前缀的长度. 现在我们想了:这个next ...
- 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 ...
- 微服务开源生态报告 No.1
从关注开源,到使用开源,再到参与开源贡献,越来越多的国内开发者通过开源技术来构建业务. 截止目前,Arthas / Dubbo / ChaosBalde / Nacos / RocketMQ / Se ...
- 6 获取请求头和URL信息
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers) #请求头的信息全部在这里面 p ...
- EC Round 33 F. Subtree Minimum Query 主席树/线段树合并
这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...
- codeforces2B.The least round way 题解 动态规划/模拟
题目出处:http://codeforces.com/problemset/problem/2/B 题目描述 给你一个 \(n \times n\) 的二维数组,它包含的元素都是非负整数.你需要寻找一 ...
- js切割字符串
var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8); console.log(t); 输出 19-9-10