题目大意:给定一个长度为 N 的序列,支持两种询问,即:区间异或,区间求和。

题解:加深了对线段树的理解。

对于线段树维护的变量一定是易于 modify 的,对于查询的答案只需用维护的东西进行组合而成即可。

异或和加法不具有分配律,因此不能直接维护区间和。考虑开 32 棵线段树,第 i 棵线段树维护区间值二进制第 i 位 1 的个数,最后只需用 32 棵线段树对应区间 1 的个数去组合出区间和即可。

代码如下

#include <bits/stdc++.h>
#define ls(o) o<<1
#define rs(o) o<<1|1
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll fpow(ll a,ll b,ll c){ll ret=1%c;for(;b;b>>=1,a=a*a%c)if(b&1)ret=ret*a%c;return ret;}
inline ll read(){
ll x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
/*------------------------------------------------------------*/ int n,m,a[maxn];
struct node{int cnt;bool tag;}t[21][maxn<<2];
inline void pushup(int bit,int o){t[bit][o].cnt=t[bit][ls(o)].cnt+t[bit][rs(o)].cnt;}
inline void pushdown(int bit,int o,int l,int r){
if(!t[bit][o].tag)return;
int mid=l+r>>1;
t[bit][ls(o)].cnt=mid-l+1-t[bit][ls(o)].cnt,t[bit][ls(o)].tag^=1;
t[bit][rs(o)].cnt=r-mid-t[bit][rs(o)].cnt,t[bit][rs(o)].tag^=1;
t[bit][o].tag=0;
}
void build(int bit,int o,int l,int r){
if(l==r){
if(a[l]>>bit&1)t[bit][o].cnt=1;
else t[bit][o].cnt=0;
return;
}
int mid=l+r>>1;
build(bit,ls(o),l,mid),build(bit,rs(o),mid+1,r);
pushup(bit,o);
}
void modify(int bit,int o,int l,int r,int x,int y){//certainly modify
if(l==x&&r==y){
t[bit][o].cnt=r-l+1-t[bit][o].cnt;
t[bit][o].tag^=1;
return;
}
int mid=l+r>>1;
pushdown(bit,o,l,r);
if(y<=mid)modify(bit,ls(o),l,mid,x,y);
else if(x>mid)modify(bit,rs(o),mid+1,r,x,y);
else modify(bit,ls(o),l,mid,x,mid),modify(bit,rs(o),mid+1,r,mid+1,y);
pushup(bit,o);
}
int query(int bit,int o,int l,int r,int x,int y){
if(l==x&&r==y)return t[bit][o].cnt;
int mid=l+r>>1;
pushdown(bit,o,l,r);
if(y<=mid)return query(bit,ls(o),l,mid,x,y);
else if(x>mid)return query(bit,rs(o),mid+1,r,x,y);
else return query(bit,ls(o),l,mid,x,mid)+query(bit,rs(o),mid+1,r,mid+1,y);
} void read_and_parse(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=20;~i;i--)build(i,1,1,n);
}
void solve(){
m=read();
while(m--){
int opt=read();
if(opt==1){
int l=read(),r=read();
ll sum=0;
for(int i=0;i<=20;i++)sum+=(1LL<<i)*(ll)query(i,1,1,n,l,r);
printf("%lld\n",sum);
}else{
int l=read(),r=read(),val=read();
for(int i=20;~i;i--)if(val>>i&1)modify(i,1,1,n,l,r);
}
}
}
int main(){
read_and_parse();
solve();
return 0;
}

【CF242E】Xor Segment的更多相关文章

  1. 线段树+二进制位拆分【CF242E】XOR on Segment

    Description 给定一个长为\(n(n<=10^5)\)的数组 数组里的数不超过\(10^6\) 有两种操作: 1:求\(sum[l,r]\); 2:对\([l,r]\)中的所有数和\( ...

  2. 【BZOJ2337】Xor和路径(高斯消元)

    [BZOJ2337]Xor和路径(高斯消元) 题面 BZOJ 题解 我应该多学点套路: 对于xor之类的位运算,要想到每一位拆开算贡献 所以,对于每一位拆开来看 好了,既然是按位来算 我们就只需要计算 ...

  3. 【BZOJ3165】[HEOI2013]Segment(李超线段树)

    [BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...

  4. 【BZOJ2115】Xor(线性基)

    [BZOJ2115]Xor(线性基) 题面 BZOJ Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si ...

  5. 【HDU3949】XOR

    [题目大意] 给定一个数组,求这些数组通过异或能得到的数中的第k小是多少. 传送门:http://vjudge.net/problem/HDU-3949 [题解] 首先高斯消元求出线性基,然后将k按照 ...

  6. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  7. 【BZOJ-2115】Xor 线性基 + DFS

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status] ...

  8. 【bzoj2115】 Xor

    www.lydsy.com/JudgeOnline/problem.php?id=2115 (题目链接) 题意 给出一张图,可能有重边和自环,在图中找出一条从1-n的路径,使得经过的路径的权值的异或和 ...

  9. 【bzoj2115】【wc2011】Xor

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 5380  Solved: 2249[Submit][Status ...

随机推荐

  1. 前K个高频元素

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  2. mybatis generator的maven插件,找不到properties的配置文件错误的解决

    第一次运行的时候,maven插件是正确运行了的 但后面对 maven 的 build节点做了一点修改,就开始报错,找不到 properties标签指定的的数据库连接配置文件了 修改部分如下: 这个操作 ...

  3. idea创建maven项目的一点关键

    maven中的一些概念: POM:项目对象模型(Project Object Model),是项目的一些关键元信息的集合.主要包含项目管理信息.具体的项目描述.开发小组的构 成.源代码库(如CVS)和 ...

  4. QTP 自动货测试桌面程序-笔记 (单据-下拉框选择、对话框 、菜单)

    1 录制下拉框使用键盘上下键 回车键选择记录行 Window("驷惠WIN系列[汽车4S连锁管理软件] 6.").Window("采购计划").WinObjec ...

  5. 替换JDK 对eclipse的影响?

    问题  替换原有的JDK 对 eclipse有影响么? 之前用的eclipse是32位的,我的电脑是64位的,装的JDK是也是32位的,所以不影响使用! 但是,前两天装了一个ideal,新配置了一个9 ...

  6. Graphics

    Image img = Image.FromFile("g1.jpg");//建立Image对象Graphics g = Graphics.FromImage(img);//创建G ...

  7. 学习 Spring (五) Aware 接口

    Spring入门篇 学习笔记 Spring 中提供了一些以 Aware 结尾的接口,实现了 Aware 接口的 bean 在被初始化之后可以获取相应资源 通过 Aware 接口,可以对 Spring ...

  8. 转载:实现MATLAB2016a和M文件关联

    转载自http://blog.csdn.net/qq_22186119 新安装MATLAB2016a之后,发现MATLAB没有和m文件关联 每次打开m文件后都会重新打开一次MATLAB主程序 后来发现 ...

  9. M3U8文件

    M3U本质上说不是音频文件,它是音频文件的列表文件,是纯文本文件.你下载下来打开它,播放软件并不是播放它,而是根据它的记录找到网络地址进行在线播放. M3U文件的大小很小,也就是因为它里面没有任何音频 ...

  10. GitHub大佬:供计算机学习鉴黄功能的图片数据库

    ps:学无止境 想要构建一套鉴黄系统,必须有大量的真实图片供计算机进行学习,以便于区分开正常图片和黄色图片. 近期有位加拿大程序员在Github上传了图片列表,里面包含了大量图片地址可以供计算机进行学 ...