Codeforces 242 E. XOR on Segment
题目链接:http://codeforces.com/problemset/problem/242/E
线段树要求支持区间求和,区间内每一个数字异或上一个值。
既然是异或,考虑每一个节点维护一个长度为$21*2$的数组${c[x][w][0,1]}$,表示这个节点的子树所包含的线段的点中,这个$2$进制位置上的为$0$和为$1$的分别有多少个。那么一次异或操作其实就是交换了这个位置上的0,1的个数。线段树普通做就可以了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 400100
#define llg long long
#define SIZE 22
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,c[maxn][SIZE][],xorv[maxn],cnt,T;
llg ans; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} void update(llg o)
{
llg lc=o<<,rc=o<<|;
for (llg i=;i<SIZE;i++) c[o][i][]=c[lc][i][]+c[rc][i][],c[o][i][]=c[lc][i][]+c[rc][i][];
} void setv(llg o,llg val)
{
llg wz=;
while (wz<SIZE)
{
if (val&) c[o][wz][]++; else c[o][wz][]++;
val/=;
wz++;
}
} void xor_(llg o,llg val)
{
llg wz=;
while (val)
{
if (val&) swap(c[o][wz][],c[o][wz][]);
val/=;
wz++;
}
} void pushdown(llg o,llg l,llg r)
{
llg lc=o<<,rc=o<<|;
if (l==r) return ;
if (xorv[o])
{
xor_(lc,xorv[o]); xor_(rc,xorv[o]);
xorv[lc]^=xorv[o]; xorv[rc]^=xorv[o];
xorv[o]=;
}
} void build(llg o,llg l,llg r)
{
if (l==r)
{
llg x=getint();
setv(o,x);
return ;
}
llg lc=o<<,rc=o<<|,mid=(l+r)>>;
build(lc,l,mid); build(rc,mid+,r);
update(o);
} void X(llg o,llg l,llg r,llg L,llg R,llg v)
{
pushdown(o,l,r);
if (l>=L && r<=R)
{
xorv[o]^=v;
xor_(o,v);
return ;
}
llg lc=o<<,rc=o<<|,mid=(l+r)>>;
if (mid>=L) X(lc,l,mid,L,R,v);
if (R>mid) X(rc,mid+,r,L,R,v);
update(o);
} void sum(llg o,llg l,llg r,llg L,llg R)
{
pushdown(o,l,r);
if (l>=L && r<=R)
{
for (llg i=;i<SIZE;i++) ans+=(<<i)*c[o][i][];
return ;
}
llg lc=o<<,rc=o<<|,mid=(l+r)>>;
if (mid>=L) sum(lc,l,mid,L,R);
if (R>mid) sum(rc,mid+,r,L,R);
update(o);
} int main()
{
yyj("seg");
cin>>n;
build(,,n);
cin>>T;
while (T--)
{
ans=;
llg x,y,z,type;
type=getint();
if (type==)
{
x=getint(),y=getint(),ans=;
sum(,,n,x,y);
printf("%lld\n",ans);
}
else
{
x=getint(),y=getint(),z=getint();
X(,,n,x,y,z);
}
}
return ;
}
Codeforces 242 E. XOR on Segment的更多相关文章
- Codeforces 242E:XOR on Segment(位上的线段树)
http://codeforces.com/problemset/problem/242/E 题意:给出初始n个数,还有m个操作,操作一种是区间求和,一种是区间xor x. 思路:昨天比赛出的一道类似 ...
- 【codeforces 242E】XOR on Segment
[原题题面]传送门 [题面翻译]传送门 [解题思路] 操作涉及到区间求和和区间异或,考虑到异或操作,我们对每个数二进制分解. 把每一位单独提出来做,异或要么取反要么变为不变,对于每一位建一颗线段树,那 ...
- 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 ...
- CF242E XOR on Segment
CF242E XOR on Segment codeforces 洛谷 关于异或,无法运用懒标记实现区间异或: 可以像trie树一样拆位,将每个值拆成二进制数,对此建相应个数的线段树. 0 1与 0异 ...
- 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. 这题 ...
- CodeForces 242E - XOR on Segment 二维线段树?
今天练习赛的题....又是线段树的变换..拿到题我就敲了个点更新区间查询的..果断超时...然后想到了可以将每个数与合表示成不进位的二进制数..这样就可以区间进行更新了..比赛的时候写搓了..刚重写了 ...
- codeforces 242E. XOR on Segment 线段树
题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...
- CodeForces 242E "XOR on Segment"(线段树)
传送门 •题意 给你一个包含 n 个数的序列 a,定义序列上的两个操作: (1)$1,l,r\ :\ ans=\sum_{i=l}^{r}a_i$; (2)$2,l,r,x\ :\ \forall\ ...
随机推荐
- python colorama模块
colorama是一个python专门用来在控制台.命令行输出彩色文字的模块,可以跨平台使用. 1. 安装colorama模块 pip install colorama 可用格式常数: Fore: B ...
- Python+OpenCV图像处理(七)—— 滤波与模糊操作
过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...
- 【Shell循环进程并行处理】利用简单的语句实现for循环并行处理命令
在生信分析中,经常会遇到不同的重复和处理,这样的分析过程有时是非常费时且占用资源并不是很多的,可以同时在后台运行以节约时间,这是并行处理的意义.除了需要并行处理,循环迭代来遍历整个文件夹的需要分析的数 ...
- Struts2 的 配置
三.Struts2配置 Struts2的核心配置文件 1.名称和位置是固定的 在src下struts.xml 2.Struts根标签 Package Action Result Action Pa ...
- tomcat 启动时遇到org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs
当发生这样的错误的时候 org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet ...
- Zookeeper本地模式安装
本地模式安装部署 1.安装前准备 (1)安装Jdk (2)拷贝Zookeeper安装包到Linux系统下 (3)解压到指定目录 tar -zxvf zookeeper-3.4.10.tar.gz -C ...
- JDK JRE JVM的区别
Jdk[Java Development ToolKit]就是java开发工具箱, JDK是整个JAVA的核心,里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编 ...
- Linux 流量监控工具 iftop
Linux 流量监控工具 iftop Iftop工具主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同哪台机器间的流量大小,非常适合于代理服务器和iptables服务器使用,这样可以方便的查 ...
- oracle 12c直方图收集的增强
在oracle 12c之前,收集直方图信息是相对比较耗费资源的,因为要重复扫描几次:在oracle 12c中,则有较大的提升,具体可参考https://jonathanlewis.wordpress. ...
- VIM自动补全Python代码
pydiction插件 https://codeload.github.com/rkulla/pydiction/zip/master 新建bundle文件夹 mkdir ~/.vim/bundle ...