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$棵树. 给出每一 ...
随机推荐
- python中字母的大小写转换
1. capitalize(): 首字母大写,其余全部小写 2. upper() :全转换成大写 3. lower(): 全转换成小写 4. title() :标题首字大写,如 &q ...
- DELL(linux 系统里系统掉盘)(阵列Foreign)命令行里重做阵列
故障现象 (阵列Foreign 系统下重做阵列) 例:四合一机器(DELL_XENCOMPA09) 有四个硬盘 如图 少认到一个 df -h fdisk -l 2>/dev/null | gr ...
- 在Struts2里面嵌入Spring
第一步:在web.xml中增加以下的listener <listener> <listener-class>org.springframework.web.context.Co ...
- JS放在body与head中的不同
放在body和head其实差不多的,只不过是文档解析的时间不同.浏览器解析html是从上到下的.如果把javascript放在head里的话,则先被解析,但这时候body还没有解析,所以$(#btn) ...
- 洛谷1602 Sramoc问题
刚看到这道题的时候感觉像spfa. 然后发现其实bfs就可以做了. //Serene #include<algorithm> #include<iostream> #inc ...
- js中+号强制转换小例子
1 <script> console.log(([]+{}).length); </script> </head> 输出竟然是: 为什么会是15呢? 因为在+号的强 ...
- spring boot 2.X上传文件限制大小
Spring Boot 1.3.x multipart.maxFileSize multipart.maxRequestSize Spring Boot 1.4.x and 1.5.x spring. ...
- 基于GIS的空间分析功能分析芝加哥小熊队和白袜队的球迷范围
将交换格式的文件转换为要素类 在ArcCatalog中新建地址定位器 设置地址定位器的样式 选择Arctoolbox->地理编码工具->对地址进行地理编码 定义坐标系 定义坐标系后如图所示 ...
- android完美的退出方法
http://blog.csdn.net/get123/article/details/9001214
- LightOJ 1370 Bi-shoe and Phi-shoe【欧拉函数 && 质数】
题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370 题意: 给定值,求满足欧拉值大于等于这个 ...